public override void Save(SaveContext saveContext)
        {
            var utility = saveContext.Utility;

            base.Save(saveContext);

            utility.Write(Flags);

            saveContext.WritePointerPlaceholder(BoundingBox);

            PositionOffset.Write(utility);

            saveContext.WriteObjectListPointerPlaceholder(SubMeshes);

            utility.Write(BaseAddress);

            saveContext.WriteObjectListPointerPlaceholder(VertexBuffers);

            saveContext.WritePointerPlaceholder(BlendShape);

            /////////////////////////////
            // Begin saving dependent data

            saveContext.SaveAndMarkReference(SubMeshes);
            saveContext.SaveAndMarkReference(VertexBuffers);
            saveContext.SaveAndMarkReference(BoundingBox);

            SubMeshes.SaveList(saveContext);
            VertexBuffers.SaveList(saveContext);

            saveContext.SaveAndMarkReference(BlendShape);
        }
        public void Save(SaveContext saveContext)
        {
            var utility = saveContext.Utility;

            CGFXDebug.SaveStart(this, saveContext);

            utility.Write(TypeId);

            utility.Write(DynamicAllocator);

            // Texture Reference
            saveContext.WritePointerPlaceholder(TextureReference);

            // Sampler
            saveContext.WritePointerPlaceholder(TextureSampler);


            utility.Write(Commands);
            utility.Write(CommandsLength);  // Seems to be length of the aforementioned "Commands"?

            /////////////////////////////
            // Begin saving dependent data

            saveContext.SaveAndMarkReference(TextureReference);
            saveContext.SaveAndMarkReference(TextureSampler);
        }
Esempio n. 3
0
        protected override void SaveInternal(SaveContext saveContext)
        {
            var utility = saveContext.Utility;

            var numEntries = Entries.Count;

            utility.Write(numEntries);

            RebuildTree();

            utility.Write(RootEntry.ReferenceBit);
            utility.Write(RootEntry.LeftNodeIndex);
            utility.Write(RootEntry.RightNodeIndex);
            if (RootEntry.Name != null) // NOTE: This is always expected to be null, I'm just being needlessly thorough
            {
                saveContext.StringTable.EnqueueAndWriteTempRel(RootEntry.Name);
            }
            else
            {
                saveContext.Utility.Write(0u);
            }
            saveContext.WritePointerPlaceholder(RootEntry.EntryObject);

            for (var i = 0; i < numEntries; i++)
            {
                var entry = Entries[i];
                utility.Write(entry.ReferenceBit);
                utility.Write(entry.LeftNodeIndex);
                utility.Write(entry.RightNodeIndex);
                saveContext.StringTable.EnqueueAndWriteTempRel(entry.Name);
                saveContext.WritePointerPlaceholder(entry.EntryObject);
            }
        }
        public override void Save(SaveContext saveContext)
        {
            var utility = saveContext.Utility;

            base.Save(saveContext);

            utility.Write(ShapeIndex);
            utility.Write(MaterialId);

            saveContext.WritePointerPlaceholder(Model);

            utility.Write((byte)(IsVisible ? 1 : 0));
            utility.Write(RenderPriority);
            utility.Write(MeshNodeIndex);  // ObjectNodeVisibilityIndex in Ohana3DS, MeshNodeIndex in SPICA
            utility.Write(PrimitiveIndex); // CurrentPrimitiveIndex in Ohana3DS

            utility.Write(Flags);
            utility.Write(AttrScaleCommands);
            utility.Write(EnableCommandsPtr);
            utility.Write(EnableCommandsLength);
            utility.Write(DisableCommandsPtr);
            utility.Write(DisableCommandsLength);
            saveContext.StringTable.EnqueueAndWriteTempRel(MeshNodeName);
            utility.Write(RenderKeyCache);
            utility.Write(CommandAlloc);

            // UNKNOWN, not in SPICA or anywhere I can tell, see notes at declaration
            utility.Write(Unknown1);
            utility.Write(Unknown2);

            if (Unknown3 != null)
            {
                utility.Write(Unknown3.Value);
            }
        }
        public override void Save(SaveContext saveContext)
        {
            var utility = saveContext.Utility;

            // Update the internal OriginalOffset; we'll need this to resolve the reference bones later
            OriginalOffset = utility.GetWritePosition();

            // Unlike most objects loaded from a DICT, bones DO NOT use the stndard
            // Type/Magic/Revision/Name/MetaData header and instead do their own thing...
            // (in short, not calling base.Save() here!!)
            saveContext.StringTable.EnqueueAndWriteTempRel(Name);

            utility.Write((uint)Flags);

            utility.Write(Index);

            // Fix ParentIndex in case it's wrong (note that Indexes MUST be correct before Save()!)
            ParentIndex = Parent?.Index ?? -1;  // -1 is used if null (root bone)
            utility.Write(ParentIndex);

            saveContext.WritePointerPlaceholder(Parent);
            saveContext.WritePointerPlaceholder(Child);
            saveContext.WritePointerPlaceholder(PrevSibling);
            saveContext.WritePointerPlaceholder(NextSibling);

            Scale.Write(utility);
            Rotation.Write(utility);
            Translation.Write(utility);

            LocalTransform.Write(utility);
            WorldTransform.Write(utility);
            InvWorldTransform.Write(utility);

            utility.Write((uint)BillboardMode);

            saveContext.WriteDICTPointerPlaceholder(MetaDatas);

            /////////////////////////////
            // Begin saving dependent data

            saveContext.SaveAndMarkReference(MetaDatas);

            MetaDatas?.SaveEntries(saveContext);
        }
        public override void Save(SaveContext saveContext)
        {
            base.Save(saveContext);

            var utility = saveContext.Utility;

            saveContext.WriteObjectListPointerPlaceholder(Meshes);

            // Materials
            saveContext.WriteDICTPointerPlaceholder(ModelMaterials);

            // Shapes
            saveContext.WriteObjectListPointerPlaceholder(Shapes);

            // Mesh Node Visibilities
            saveContext.WriteObjectListPointerPlaceholder(MeshNodeVisibilities);

            utility.Write(Flags);

            utility.Write((uint)FaceCulling);

            utility.Write(LayerId);

            // Load a Skeleton if this model has one
            if (HasSkeleton)
            {
                saveContext.WritePointerPlaceholder(Skeleton);
            }

            /////////////////////////////
            // Begin saving dependent data

            // Save Lists
            saveContext.SaveAndMarkReference(Meshes);
            saveContext.SaveAndMarkReference(Shapes);
            saveContext.SaveAndMarkReference(MeshNodeVisibilities);      // I'm not SURE this is where this goes (no test data at the moment I'm writing this) but all lists seem to follow here

            // Save DICT headers
            saveContext.SaveAndMarkReference(MetaDatas);
            saveContext.SaveAndMarkReference(AnimGroup);
            saveContext.SaveAndMarkReference(ModelMaterials);

            // Now for other interior data...
            MetaDatas?.SaveEntries(saveContext);
            AnimGroup?.SaveEntries(saveContext);

            Meshes.SaveList(saveContext);
            ModelMaterials?.SaveEntries(saveContext);
            Shapes.SaveList(saveContext);
            MeshNodeVisibilities.SaveList(saveContext);

            if (HasSkeleton)
            {
                saveContext.SaveAndMarkReference(Skeleton);
            }
        }
Esempio n. 7
0
        public void Save(SaveContext saveContext)
        {
            var utility = saveContext.Utility;

            CGFXDebug.SaveStart(this, saveContext);

            utility.Write(TypeId);

            saveContext.StringTable.EnqueueAndWriteTempRel(SamplerName);
            saveContext.StringTable.EnqueueAndWriteTempRel(TableName);

            saveContext.WritePointerPlaceholder(LUT);
        }
Esempio n. 8
0
        public void Save(SaveContext saveContext)
        {
            var utility = saveContext.Utility;

            CGFXDebug.SaveStart(this, saveContext);

            utility.Write(TypeId);

            saveContext.WritePointerPlaceholder(Parent);

            utility.Write((uint)MinFilter);

            BorderColor.Save(utility);
            utility.Write(LODBias);
        }
Esempio n. 9
0
            public void Save(SaveContext saveContext)
            {
                var utility = saveContext.Utility;

                CGFXDebug.SaveStart(this, saveContext);

                utility.Write((uint)Input);
                utility.Write((uint)Scale);

                saveContext.WritePointerPlaceholder(Sampler);

                /////////////////////////////
                // Begin saving dependent data

                saveContext.SaveAndMarkReference(Sampler);
            }
Esempio n. 10
0
        public void Save(SaveContext saveContext)
        {
            var utility = saveContext.Utility;

            CGFXDebug.SaveStart(this, saveContext);

            TexEnvBufferColorF.Save(utility);

            // Fragment Shader
            utility.Write(FragmentFlags);
            utility.Write((uint)TranslucencyKind);
            utility.Write((uint)FresnelSelector);
            utility.Write((uint)BumpTexture);
            utility.Write((uint)BumpMode);
            utility.Write(IsBumpRenormalize ? 1u : 0u);

            // Fragment Lighting
            var pointerTableForFragLightLUTs = new[]
            {
                ReflectanceRSampler,
                ReflectanceGSampler,
                ReflectanceBSampler,
                Distribution0Sampler,
                Distribution1Sampler,
                FresnelSampler
            };

            saveContext.WritePointerPlaceholder(pointerTableForFragLightLUTs);

            for (var i = 0; i < TextureEnvironments.Length; i++)
            {
                TextureEnvironments[i].Save(saveContext);
            }

            utility.Write(AlphaTestRawCommands);

            utility.Write(FragmentShaderRawCommands);

            /////////////////////////////
            // Begin saving dependent data

            saveContext.SaveAndMarkReference(pointerTableForFragLightLUTs);

            pointerTableForFragLightLUTs.SaveList(saveContext);
        }
        public override void Save(SaveContext saveContext)
        {
            base.Save(saveContext);

            var utility = saveContext.Utility;

            utility.Write(MaterialFlags);

            utility.Write((uint)TextureCoordinatesConfig);
            utility.Write((uint)TranslucencyKind);

            // NOTE: These are inline, not pointered to
            MaterialColor.Save(saveContext);
            Rasterization.Save(saveContext);
            FragmentOperation.Save(saveContext);

            // Texture coordinates
            utility.Write(UsedTextureCoordinates);

            for (var i = 0; i < TextureCoords.Length; i++)
            {
                var tc = TextureCoords[i];

                utility.Write(tc.SourceCoordIndex);
                utility.Write((uint)tc.MappingType);
                utility.Write(tc.ReferenceCameraIndex);
                utility.Write((uint)tc.TransformType);
                tc.Scale.Write(utility);
                utility.Write(tc.Rotation);
                tc.Translation.Write(utility);
                utility.Write(tc.Flags);
                tc.Transform.Write(utility);
            }

            // Texture mappers
            for (var i = 0; i < TextureMappers.Length; i++)
            {
                saveContext.WritePointerPlaceholder(TextureMappers[i]);
            }

            saveContext.WritePointerPlaceholder(ShaderReference);

            saveContext.WritePointerPlaceholder(FragmentShader);

            utility.Write(ShaderProgramDescIndex);

            // NOT SUPPORTED
            utility.Write(ShaderParametersCount);
            utility.Write(ShaderParametersPointerTableOffset);
            if (ShaderParametersCount != 0 || ShaderParametersPointerTableOffset != 0)
            {
                throw new NotImplementedException($"ModelMaterial Save: Shader Parameters UNSUPPORTED");
            }


            utility.Write(LightSetIndex); // Reference??
            utility.Write(FogIndex);      // Reference??

            // NOTE -- See SPICA GfxMaterial.cs for computations involving these hash functions.
            // I ASSUME if I never change any values in the material these never need recomputed.
            // Let's try to get by without needing this support right now...
            utility.Write(MaterialFlagsHash);
            utility.Write(ShaderParamsHash);
            utility.Write(TextureCoordsHash);
            utility.Write(TextureSamplersHash);
            utility.Write(TextureMappersHash);
            utility.Write(MaterialColorsHash);
            utility.Write(RasterizationHash);
            utility.Write(FragLightHash);
            utility.Write(FragLightLUTHash);
            utility.Write(FragLightLUTSampHash);
            utility.Write(TextureEnvironmentHash);
            utility.Write(AlphaTestHash);
            utility.Write(FragOpHash);
            utility.Write(UniqueId);

            /////////////////////////////
            // Begin saving dependent data

            TextureMappers.SaveList(saveContext);
            saveContext.SaveAndMarkReference(ShaderReference);
            saveContext.SaveAndMarkReference(FragmentShader);
        }