SUNRISE STUDIO

Native authoring profiles

Studio writes new game data only for layouts it has verified. Each verified layout is a profile. An input that does not fit a profile is refused instead of guessed.

Static mesh profile

New static models use one profile.

propertyvalue
model class0x808071A7
resource class0x80807194
input declaration123
position stream8-byte stride, signed normalized XYZ shorts
attribute stream20-byte stride: UV, normal and tangent shorts
index stream32-bit triangle list
render stage0
partsone part per imported primitive; all parts share one buffer group
materialone per part: the given material, or the template’s

The template’s vertex shader must match one exact bytecode hash. That shader reads XYZ positions, XY UVs, XYZ normals and XYZW tangents, and builds the bitangent from the normal, the tangent and the tangent’s W sign. The hash check stops a matching declaration from standing in for a shader that reads other attributes.

The compiler computes new position and UV scales, and generates tangents from the imported positions, normals and UVs. Mirrored UVs keep their handedness.

entrystored as
model header, mesh resource, three buffer headersdeltas of the installed template
position, attribute and index payloadsthe imported data, owned by the project

Typed arrays are appended and their descriptors updated. Unknown template bytes stay tied to the original package through the delta. No original geometry is copied into the project. Studio picks the checked installed template by default, then searches other supported static models.

The original asset importer uses this profile too. With Skip unsupported surfaces, it imports a skinned mesh as static geometry at its node transform. Whether this matches the Blender rest pose is unverified.

Original asset materials

The original asset importer clones one checked opaque game material, 815B8158, after verifying the installed material and shader hashes. Its vertex shader matches declaration 123.

glTF inputgame input
base color texture and factorslot 0 RGB, sRGB RGBA8; factors baked in linear color
metallic texture blue channel and factorslot 1 red
roughness texture green channel and factorslot 1 green, as one minus roughness
normal texture and scaleslot 2 red and green, with reversed green
no normal texturea flat tangent normal

New constants turn off the template’s emission and tint. Normal blue is one, so it does not cap smoothness. Texture coordinates keep the glTF image orientation. The game shader keeps its own samplers and bytecode.

Normal maps follow the glTF normal texture rules: decode RGB to XYZ, scale X and Y, then normalize. Positive Z lets the game shader rebuild Z. Normals facing negative Z cannot use this profile. They are refused, or replaced by a flat normal with Skip unsupported surfaces.

Each material becomes nine entries: a material, a constant-buffer pair and three texture pairs. Texture maps are RGBA8 with one mip, so colors and factors can lose some precision. Material textures must be PNG images.

The importer refuses these unless Skip unsupported surfaces omits them: alpha blending and masks, emission, occlusion textures, double-sided shading, material and texture extensions, texture transforms, UV sets other than UV0, wrapping other than repeat, and nearest filtering.

Skinned model profile

Skinned model replacement accepts one vertex profile.

propertyvalue
input declaration16
streams16 bytes of position, weights and joints; 20 bytes of UV, normal and tangent
weightsfour byte weights per vertex
joint indicesbytes
vertex shadera matrix-palette shader pinned by bytecode hash
shadow passits own pinned four-weight matrix shader

Dual-quaternion, cloth and other profiles are refused. Every material alternative of the part must use the pinned shader. The template must be visible in its initial state.

The reader follows the glTF skin rules. It ignores the mesh node transform and builds the bind shape from the joint transforms and inverse bind matrices. Geometry converts to package Z-up space once. Joint properties, or unique template names, map the file’s joint order to the package’s. Tangents are rebuilt from UV0.

The compiler refuses a replacement unless these hold:

  • The bone count, bone name hashes and parent order match the installed rig.
  • Both bind matrices of every bone match the rig within 0.0002.
  • Every vertex has four weights that sum to one. They are stored as bytes that sum to 255.
  • Every weighted joint is inside the bone range the model uses, at most 256 bones.
  • Every vertex lies inside the bind bounds of the source model.
modestored as
replacethe model and its six buffers, as deltas of the installed originals
createnine added entries, as deltas of the originals; the installed root is untouched

The working glTF is never copied into the project. Each replacement allocates new buffer entries. The earlier ones stay in the project. Source hashes are checked again before the one transaction publishes.

The create mode supports the Hob root 80B82FE3, component 80C443F8 and model 80C4424F. The root and its 62 component configs must match the installed profile.

Animation control profile

The control importer edits existing control channels of a clip.

supportedvalue
channel codecs2 and 3
channelstranslation, rotation, uniform scale
keyslinear or step, sampled at 30 Hz
layoutthe original duration, control groups, component maps and value ranges

Sparse codec-1 channels are left out of the export and stay unchanged. The writer changes sample words only and keeps the rest of the clip. Every result is decoded again before it is saved. Node custom properties carry identity, in case an editor drops file-level extras. External buffer paths must stay inside the imported file’s folder.