示例#1
0
 public void SetupCosmeticInformation(Derived model, DataTreeObject dataTreeParent)
 {
     if (dataTreeParent == null)
     {
         return;
     }
     dataTreeParent.AddSimpleProperty("Referenced Model", model.model.getName(), SilkImage.Reference, SilkImage.Reference, false);
 }
        public void SetupCosmeticInformation(MergedStaticConfig model, DataTreeObject dataTreeParent)
        {
            ComponentModel[] componentModels = model.models;
            List <object>    refs            = new List <object>();

            foreach (ComponentModel mdl in componentModels)
            {
                refs.Add(mdl.model.getName());
            }
            dataTreeParent.AddSimpleProperty(componentModels.Length + " model references", refs.ToArray(), SilkImage.Reference, SilkImage.Reference, false);
        }
示例#3
0
        public static void SetupCosmeticData(TudeySceneModel scene, DataTreeObject dataTreeParent)
        {
            if (dataTreeParent == null)
            {
                return;
            }

            DataTreeObject entryContainer = new DataTreeObject {
                Text     = scene.getEntries().size().ToString(),
                ImageKey = SilkImage.Value
            };

            dataTreeParent.AddSimpleProperty("Entries", entryContainer);
        }
示例#4
0
        public void SetupCosmeticInformation(CompoundConfig model, DataTreeObject dataTreeParent)
        {
            ComponentModel[] componentModels = model.models;
            List <object>    refs            = new List <object>();

            foreach (ComponentModel mdl in componentModels)
            {
                // Yes, there are cases where this is null.
                if (mdl.model?.getName() != null)
                {
                    refs.Add(mdl.model.getName());
                }
            }
            dataTreeParent.AddSimpleProperty(componentModels.Length + " model references", refs.ToArray(), SilkImage.Reference, SilkImage.Reference, false);
        }
        public void SetupCosmeticInformation(ArticulatedConfig model, DataTreeObject dataTreeParent)
        {
            if (dataTreeParent == null)
            {
                return;
            }

            AnimationMapping[] animMaps   = model.animationMappings;
            object[]           animations = new object[animMaps.Length];
            for (int idx = 0; idx < animations.Length; idx++)
            {
                animations[idx] = animMaps[idx].name;
            }
            dataTreeParent.AddSimpleProperty("Animations", animations, SilkImage.Value, SilkImage.Animation, false);
        }
        public void SetupCosmeticInformation(StaticSetConfig model, DataTreeObject dataTreeParent)
        {
            if (dataTreeParent == null)
            {
                return;
            }

            // So a note to self: Static sets have the 'meshes' container which is a map of other model files.
            // In SK Animator Tools V1 I was an idiot and thought the "model" property was the only key. This is false.
            // Instead, model represents the *default selection*. There may be more models. Iterate through the keys like damn lol.


            DataTreeObjectProperty targetProp = dataTreeParent.AddSimpleProperty("Target Set Model", model.model);

            targetProp.ExtraData["StaticSetConfig"] = model;
            // if (useOnlyTargetModel) dataTreeParent.AddSimpleProperty("Special Directive", "Only export target model", SilkImage.Scripted);

            List <object> objects = new List <object>();

            if (model.meshes != null)
            {
                object[] keys  = model.meshes.keySet().toArray();
                int      msIdx = 0;
                foreach (object key in keys)
                {
                    MeshSet        subModel    = (MeshSet)model.meshes.get(key);
                    VisibleMesh[]  meshes      = subModel.visible;
                    DataTreeObject subModelRef = new DataTreeObject()
                    {
                        Text     = key.ToString(),
                        ImageKey = SilkImage.ModelSet
                    };

                    List <object> subModels = new List <object>();
                    int           idx       = 0;
                    foreach (VisibleMesh mesh in meshes)
                    {
                        subModels.Add(new DataTreeObjectProperty("Mesh " + idx, SilkImage.Triangle));
                        idx++;
                    }

                    subModelRef.AddSimpleProperty("Geometry", subModels.ToArray(), SilkImage.Variant, SilkImage.Value, false);
                    objects.Add(subModelRef);
                    msIdx++;
                }
            }
            dataTreeParent.AddSimpleProperty("Contained Meshes", objects.ToArray(), SilkImage.Reference, SilkImage.Reference, false);
        }
示例#7
0
            public void SetupCosmeticInformation(Schemed model, DataTreeObject dataTreeParent)
            {
                if (dataTreeParent == null)
                {
                    return;
                }

                SchemedModel[] models = model.models;
                List <object>  refs   = new List <object>();

                foreach (SchemedModel schemedModel in models)
                {
                    refs.Add(schemedModel.model.getName());
                }
                dataTreeParent.AddSimpleProperty(models.Length + " Schemed References", refs.ToArray(), SilkImage.Reference, SilkImage.SchemedModel);
            }
示例#8
0
        public void SetupCosmeticInformation(TileEntry data, DataTreeObject dataTreeParent)
        {
            if (dataTreeParent == null)
            {
                return;
            }

            // This method returns a property, but this is just a stock object (it was created this way in TudeySceneConfigBrancher)
            List <DataTreeObject> values          = dataTreeParent.Properties[dataTreeParent.FindSimpleProperty("Entries")];
            DataTreeObject        prop            = values.First();
            DataTreeObject        existingTileCtr = prop.FindSimpleProperty("Tiles");

            if (existingTileCtr != null)
            {
                // Yes, there is a reason you call find twice. The implicit cast from property to object on existingTileCtr creates a new object
                // as such, casting it back for use in this lookup is a different key.
                existingTileCtr = prop.Properties[prop.FindSimpleProperty("Tiles")].FirstOrDefault();
            }
            DataTreeObject tilesContainer = existingTileCtr ?? new DataTreeObject()
            {
                ImageKey = SilkImage.Tile
            };

            if (existingTileCtr == null)
            {
                // We made a new one. Add it.
                prop.AddSimpleProperty("Tiles", tilesContainer);
            }

            DataTreeObject individualTileDataContainer = new DataTreeObject()
            {
                Text = data.tile.getName(),
                // ImageKey = SilkImage.Tile
            };


            Coord location = data.getLocation();

            //Transform3D trs = new Transform3D(new Vector3f(location.x, data.elevation, location.y), new Quaternion().fromAngleAxis((float)(data.rotation * Math.PI / 2), Vector3f.UNIT_Y), 1f);
            individualTileDataContainer.AddSimpleProperty("Elevation", data.elevation);
            individualTileDataContainer.AddSimpleProperty("Rotation (Deg)", data.rotation * 90);
            individualTileDataContainer.AddSimpleProperty("Coordinate", $"[{location.x}, {location.y}]", SilkImage.Matrix);
            individualTileDataContainer.AddSimpleProperty("Tile Reference", data.tile?.getName(), SilkImage.Reference);
            tilesContainer.AddSimpleProperty("Entry", individualTileDataContainer, SilkImage.Tile);
        }
        /// <summary>
        /// Sets up the cosmetic data for this model, or, what's displayed in the GUI for the program.
        /// </summary>
        /// <param name="model">The <see cref="StaticConfig"/> to pull data from.</param>
        /// <param name="dataTreeParent">This is the instance in the data tree that represents this object in the hierarchy.</param>
        public void SetupCosmeticInformation(StaticConfig model, DataTreeObject dataTreeParent)
        {
            if (dataTreeParent == null)
            {
                return;
            }

            if (model.meshes != null && model.meshes.visible != null)
            {
                List <object> subModels = new List <object>();
                int           idx       = 0;
                foreach (VisibleMesh mesh in model.meshes.visible)
                {
                    subModels.Add(new DataTreeObjectProperty("Mesh " + idx, SilkImage.Triangle));
                    idx++;
                }
                dataTreeParent.AddSimpleProperty("Geometry", subModels.ToArray(), SilkImage.Variant, SilkImage.Value, false);
            }
        }
示例#10
0
        public void SetupCosmeticInformation(ConditionalConfig data, DataTreeObject dataTreeParent)
        {
            if (dataTreeParent == null)
            {
                return;
            }

            dataTreeParent.AddSimpleProperty("Default Data", MakeModelTransformPair(data.defaultModel, data.defaultTransform), SilkImage.Conditional);

            DataTreeObject optionContainer = new DataTreeObject()
            {
                ImageKey = SilkImage.Array
            };
            int idx = 0;

            foreach (ConditionalConfig.Case condition in data.cases)
            {
                optionContainer.AddSimpleProperty("Case " + idx, MakeModelTransformPair(condition.model, condition.transform, condition.condition), SilkImage.Conditional);
                idx++;
            }
            dataTreeParent.AddSimpleProperty("Cases", optionContainer, SilkImage.Array);
        }
        public void SetupCosmeticInformation(PlaceableEntry data, DataTreeObject dataTreeParent)
        {
            if (dataTreeParent == null)
            {
                return;
            }
            Transform3D transform = GetTransformField(data);

            // This method returns a property, but this is just a stock object (it was created this way in TudeySceneConfigBrancher)
            List <DataTreeObject> values = dataTreeParent.Properties[dataTreeParent.FindSimpleProperty("Entries")];
            DataTreeObject        prop   = values.First();
            DataTreeObject        existingPlaceableCtr = prop.FindSimpleProperty("Placeable Objects");

            if (existingPlaceableCtr != null)
            {
                // Yes, there is a reason you call find twice. The implicit cast from property to object on existingTileCtr creates a new object
                // as such, casting it back for use in this lookup is a different key.
                existingPlaceableCtr = prop.Properties[prop.FindSimpleProperty("Placeable Objects")].FirstOrDefault();
            }
            DataTreeObject placeableContainer = existingPlaceableCtr ?? new DataTreeObject()
            {
                ImageKey = SilkImage.Variant
            };

            if (existingPlaceableCtr == null)
            {
                // We made a new one. Add it.
                prop.AddSimpleProperty("Placeable Objects", placeableContainer);
            }

            DataTreeObject individualPlacementCtr = new DataTreeObject()
            {
                Text = data.placeable.getName()
            };

            individualPlacementCtr.AddSimpleProperty("Transform", transform.toString(), SilkImage.Matrix);
            individualPlacementCtr.AddSimpleProperty("Reference", data.getReference()?.getName() ?? "null", SilkImage.Reference);
            placeableContainer.AddSimpleProperty("Entry", individualPlacementCtr);
        }
示例#12
0
        public void SetupCosmeticInformation(ViewerAffecterConfig model, DataTreeObject dataTreeParent)
        {
            if (dataTreeParent == null)
            {
                return;
            }
            ViewerEffectConfig effect = model.effect;
            string             cls    = JavaClassNameStripper.GetWholeClassName(effect.getClass());

            if (cls == null)
            {
                XanLogger.WriteLine("WARNING: Attempt to get class of ViewerEffectConfig failed!");
                return;
            }

            DataTreeObjectProperty implementationPropKey = dataTreeParent.FindSimpleProperty("Implementation");
            DataTreeObject         implementationProp    = dataTreeParent.Properties[implementationPropKey].First();

            implementationProp.Text = cls.Replace("$", "::");
            if (effect is Skybox skybox)
            {
                dataTreeParent.ImageKey = SilkImage.Sky;
                string name = skybox.model?.getName();
                if (name == null && dataTreeParent.Parent != null && dataTreeParent.Parent.ImageKey == SilkImage.Schemed)
                {
                    dataTreeParent.ImageKey = SilkImage.Scheme;
                    dataTreeParent.AddSimpleProperty("Data Type", "Render Scheme", SilkImage.Scheme);
                }
                else
                {
                    // Name may still be null here.
                    SilkImage target = name == null ? SilkImage.Missing : SilkImage.ModelSet;
                    dataTreeParent.AddSimpleProperty("Model Reference", name, SilkImage.Reference, target, false);
                }

                Transform3D newTrs = new Transform3D(skybox.translationOrigin, Quaternion.IDENTITY, skybox.translationScale.x);
                dataTreeParent.AddSimpleProperty("Transform", newTrs.toString(), SilkImage.Matrix);
            }
        }
示例#13
0
        /// <summary>
        /// Sends an arbitrary <see cref="ModelConfig"/> into the data brancher and processes it.
        /// </summary>
        /// <param name="sourceFile">The file that the given <see cref="ModelConfig"/> came from.</param>
        /// <param name="model">The <see cref="ModelConfig"/> itself.</param>
        /// <param name="models">A list containing every processed model from the entire hierarchy.</param>
        /// <param name="currentDataTreeObject">The current element in the data tree hierarchy to use.</param>
        /// <param name="useImplementation">If <see langword="false"/>, the name of the implementation will be displayed instead of the file name. Additionally, it will not have its implementation property.</param>
        /// <param name="transform">Intended to be used by reference loaders, this specifies an offset for referenced models. All models loaded by this method in the given chain / hierarchy will have this transform applied to them. If the value passed in is <see langword="null"/>, it will be substituted with a new <see cref="Transform3D"/>.</param>
        /// <param name="extraData">Any extra data that should be included. This is mainly used by references (e.g. a reference is a <see cref="StaticSetConfig"/>, the target model in the set may be included as extra data)</param>
        public static void HandleDataFrom(FileInfo sourceFile, ModelConfig model, List <Model3D> models, DataTreeObject currentDataTreeObject = null, bool useImplementation = false, Transform3D transform = null, Dictionary <string, dynamic> extraData = null)
        {
            transform = transform ?? new Transform3D();
            //transform.promote(Transform3D.GENERAL);

            SKAnimatorToolsProxy.IncrementEnd(2);

            ModelConfig.Implementation implementation = model.implementation;
            if (implementation == null)
            {
                XanLogger.WriteLine("Implementation is null! Sending error.", XanLogger.DEBUG);
                if (currentDataTreeObject != null)
                {
                    currentDataTreeObject.Text     = "Unknown Implementation";
                    currentDataTreeObject.ImageKey = SilkImage.Generic;
                }
                SKAnimatorToolsProxy.SetProgressState(ProgressBarState.Error);
                throw new ClydeDataReadException("This specific model does not have an implementation, which is the data for the model itself. This generally happens if the implementation is from another game that uses Clyde and has defined its own custom model types (e.g. Spiral Knights does this). As a result, the program cannot extract any information from this file. Sorry!", "Can't Read Model", MessageBoxIcon.Error);
            }

            string implName = (JavaClassNameStripper.GetWholeClassName(implementation.getClass()) ?? implementation.getClass().getTypeName()).Replace("$", "::");

            if (currentDataTreeObject != null)
            {
                if (useImplementation)
                {
                    currentDataTreeObject.Text = implName;
                }
                else
                {
                    currentDataTreeObject.Text = sourceFile.Name;
                }
            }

            ModelConfigHandler.SetupCosmeticInformation(model, currentDataTreeObject, useImplementation);

            SKAnimatorToolsProxy.IncrementProgress();             // Got model display data.
            // Next one is to load the data.
            if (implementation is ArticulatedConfig)
            {
                XanLogger.WriteLine("Model is of the type 'ArticulatedConfig'. Accessing handlers...", XanLogger.DEBUG);
                if (currentDataTreeObject != null)
                {
                    currentDataTreeObject.ImageKey = SilkImage.Articulated;
                }

                // New special case: Is it a knight?
                //if (sourceFile.Directory.Name == "crew" && sourceFile.Name == "model.dat") {
                //	XanLogger.WriteLine("Model was a knight. Performing special behavior for knights...", XanLogger.DEBUG);
                //	NPCKnightHandler.Instance.HandleModelConfig(sourceFile, model, models, currentDataTreeObject, transform, extraData);
                //} else {
                ArticulatedConfigHandler.Instance.HandleModelConfig(sourceFile, model, models, currentDataTreeObject, transform, extraData);
                //}
            }
            else if (implementation is StaticConfig)
            {
                XanLogger.WriteLine("Model is of the type 'StaticConfig'. Accessing handlers...", XanLogger.DEBUG);
                if (currentDataTreeObject != null)
                {
                    currentDataTreeObject.ImageKey = SilkImage.Static;
                }
                StaticConfigHandler.Instance.HandleModelConfig(sourceFile, model, models, currentDataTreeObject, transform, extraData);
            }
            else if (implementation is StaticSetConfig)
            {
                XanLogger.WriteLine("Model is of the type 'StaticSetConfig'. Accessing handlers...", XanLogger.DEBUG);
                if (currentDataTreeObject != null)
                {
                    currentDataTreeObject.ImageKey = SilkImage.MergedStatic;
                }
                StaticSetConfigHandler.Instance.HandleModelConfig(sourceFile, model, models, currentDataTreeObject, transform, extraData);
            }
            else if (implementation is MergedStaticConfig)
            {
                XanLogger.WriteLine("Model is of type 'MergedStaticConfig'. Accessing handlers...", XanLogger.DEBUG);
                if (currentDataTreeObject != null)
                {
                    currentDataTreeObject.ImageKey = SilkImage.ModelSet;
                }
                MergedStaticConfigHandler.Instance.HandleModelConfig(sourceFile, model, models, currentDataTreeObject, transform, extraData);
            }
            else if (implementation is CompoundConfig)
            {
                XanLogger.WriteLine("Model is of the type 'CompoundConfig'. Accessing handlers...", XanLogger.DEBUG);
                if (currentDataTreeObject != null)
                {
                    currentDataTreeObject.ImageKey = SilkImage.ModelSet;
                }
                CompoundConfigHandler.Instance.HandleModelConfig(sourceFile, model, models, currentDataTreeObject, transform, extraData);
            }
            else if (implementation is ViewerAffecterConfig)
            {
                XanLogger.WriteLine("Model is of the type 'ViewerAffecterConfig'. Accessing handlers...", XanLogger.DEBUG);
                if (currentDataTreeObject != null)
                {
                    currentDataTreeObject.ImageKey = SilkImage.CameraShake;
                }
                ViewerAffecterConfigHandler.Instance.HandleModelConfig(sourceFile, model, models, currentDataTreeObject, transform, extraData);
            }
            else if (implementation is ModelConfig.Derived)
            {
                XanLogger.WriteLine("Model is of the type 'ModelConfig::Derived'. Accessing handlers...", XanLogger.DEBUG);
                if (currentDataTreeObject != null)
                {
                    currentDataTreeObject.ImageKey = SilkImage.Derived;
                }
                ModelConfigHandler.DerivedHandler.Instance.HandleModelConfig(sourceFile, model, models, currentDataTreeObject, transform, extraData);
            }
            else if (implementation is ModelConfig.Schemed)
            {
                XanLogger.WriteLine("Model is of the type 'ModelConfig::Schemed'. Accessing handlers...", XanLogger.DEBUG);
                if (currentDataTreeObject != null)
                {
                    currentDataTreeObject.ImageKey = SilkImage.Schemed;
                }
                ModelConfigHandler.SchemedHandler.Instance.HandleModelConfig(sourceFile, model, models, currentDataTreeObject, transform, extraData);
            }
            else if (implementation is ConditionalConfig)
            {
                XanLogger.WriteLine("Model is of the type 'ConditionalConfig'. Accessing handlers...", XanLogger.DEBUG);
                if (currentDataTreeObject != null)
                {
                    currentDataTreeObject.ImageKey = SilkImage.Conditional;
                }
                ConditionalConfigHandler.Instance.HandleModelConfig(sourceFile, model, models, currentDataTreeObject, transform, extraData);
            }
            else
            {
                XanLogger.WriteLine($"\nERROR: A ModelConfig had an unknown implementation!\n=> Implementation: {implName}\n=> Referenced In: {sourceFile}\n", XanLogger.DEBUG);
                // AsyncMessageBox.ShowAsync("This specific implementation is valid, but it has no handler! (There's no code that can translate this data for you :c).\nImplementation: " + implementation.getClass().getTypeName(), "Can't Handle Model", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                if (currentDataTreeObject != null)
                {
                    currentDataTreeObject.ImageKey = SilkImage.Generic;
                }
            }
            SKAnimatorToolsProxy.IncrementProgress();
            // Handled model.
        }
        public void HandleModelConfig(FileInfo sourceFile, ModelConfig baseModel, List <Model3D> modelCollection, DataTreeObject dataTreeParent = null, Transform3D globalTransform = null, Dictionary <string, dynamic> extraData = null)
        {
            // ModelConfigHandler.SetupCosmeticInformation(baseModel, dataTreeParent);

            // ArticulatedConfig has a lot of steps.
            SKAnimatorToolsProxy.IncrementEnd(4);

            ArticulatedConfig model = (ArticulatedConfig)baseModel.implementation;

            SetupCosmeticInformation(model, dataTreeParent);

            MeshSet meshes = model.skin;

            VisibleMesh[] renderedMeshes = meshes.visible;
            Dictionary <string, Armature> allInstantiatedArmatures = new Dictionary <string, Armature>();

            List <Model3D> allModelsAndNodes = new List <Model3D>();

            // 1
            SKAnimatorToolsProxy.IncrementProgress();

            int    idx           = 0;
            string depth1Name    = ResourceDirectoryGrabber.GetDirectoryDepth(sourceFile);
            string fullDepthName = ResourceDirectoryGrabber.GetDirectoryDepth(sourceFile, -1);

            SKAnimatorToolsProxy.IncrementEnd(renderedMeshes.Length);
            foreach (VisibleMesh mesh in renderedMeshes)
            {
                string meshTitle = "-Skin-Mesh[" + idx + "]";

                Model3D meshToModel = GeometryConfigTranslator.GetGeometryInformation(mesh.geometry, fullDepthName + meshTitle, model.root);
                meshToModel.Name = depth1Name + meshTitle;
                if (globalTransform != null)
                {
                    meshToModel.Transform.composeLocal(globalTransform);
                }

                (List <string> textureFiles, string active) = ModelPropertyUtility.FindTexturesAndActiveFromDirects(baseModel, mesh.texture);
                meshToModel.Textures.SetFrom(textureFiles);
                meshToModel.ActiveTexture = active;

                if (meshToModel.Mesh.HasBoneData)
                {
                    XanLogger.WriteLine("Model has bone data, setting that up.", XanLogger.TRACE);
                    // meshToModel.Mesh.SetBones(model.root);
                    // ^ now called by GetGeometryInformation
                    foreach (KeyValuePair <string, Armature> boneNamesToBones in meshToModel.Mesh.AllBones)
                    {
                        allInstantiatedArmatures[boneNamesToBones.Key] = boneNamesToBones.Value;
                    }
                    allModelsAndNodes.Add(meshToModel);
                }
                modelCollection.Add(meshToModel);
                idx++;

                SKAnimatorToolsProxy.IncrementProgress();
            }
            // 2
            SKAnimatorToolsProxy.IncrementProgress();

            SKAnimatorToolsProxy.IncrementEnd(GetNodeCount(model.root));
            Dictionary <string, Model3D> nodeModels = new Dictionary <string, Model3D>();

            RecursivelyIterateNodes(baseModel, model, sourceFile, model.root, modelCollection, globalTransform, globalTransform, nodeModels, fullDepthName);
            allModelsAndNodes.AddRange(nodeModels.Values);

            SKAnimatorToolsProxy.SetProgressState(ProgressBarState.ExtraWork);
            SKAnimatorToolsProxy.IncrementEnd(model.attachments.Length);

            foreach (Attachment attachment in model.attachments)
            {
                List <Model3D> attachmentModels = ConfigReferenceUtil.HandleConfigReference(sourceFile, attachment.model, modelCollection, dataTreeParent, globalTransform);
                if (attachmentModels == null)
                {
                    SKAnimatorToolsProxy.IncrementProgress();
                    continue;                     // A lot of attachments have null models and I'm not sure why.
                }

                // NEW BEHAVIOR: Is the model root-less but rigged?
                // Set its root to *this* model
                foreach (Model3D mdl in attachmentModels)
                {
                    if (mdl.Mesh != null && mdl.Mesh.UsesExternalRoot)
                    {
                        mdl.Mesh.SetBones(model.root);
                    }
                }

                SKAnimatorToolsProxy.IncrementEnd(attachmentModels.Count);
                foreach (Model3D referencedModel in attachmentModels)
                {
                    referencedModel.Transform.composeLocal(attachment.transform);
                    if (allInstantiatedArmatures.ContainsKey(attachment.node ?? string.Empty))
                    {
                        referencedModel.AttachmentNode = allInstantiatedArmatures[attachment.node];
                        XanLogger.WriteLine("Attached [" + referencedModel.Name + "] to [" + attachment.node + "]", XanLogger.TRACE);
                    }
                    else
                    {
                        // New catch case: This might actually be the name of a model!
                        if (nodeModels.ContainsKey(attachment.node ?? string.Empty))
                        {
                            // Indeed it is!

                            referencedModel.AttachmentModel = nodeModels[attachment.node];
                            referencedModel.AttachmentModel.Transform.setScale(1f);                             // TODO: Is this okay?

                            if (referencedModel.Transform.getType() < Transform3D.AFFINE)
                            {
                                float scale = referencedModel.Transform.getScale();
                                referencedModel.Transform.set(new Transform3D(new Vector3f(), Quaternion.IDENTITY, scale));
                            }
                            else
                            {
                                Vector3f scale = referencedModel.Transform.extractScale();
                                referencedModel.Transform.set(new Transform3D(new Vector3f(), Quaternion.IDENTITY, scale));
                            }


                            XanLogger.WriteLine("Attached [" + referencedModel.Name + "] to [" + attachment.node + "]", XanLogger.TRACE);
                        }
                        else
                        {
                            XanLogger.WriteLine("Attachment wanted to attach to node or model [" + attachment.node + "] but it does not exist!");
                        }
                    }
                    SKAnimatorToolsProxy.IncrementProgress();
                }
                SKAnimatorToolsProxy.IncrementProgress();
            }

            SKAnimatorToolsProxy.SetProgressState(ProgressBarState.OK);
            // 3
            SKAnimatorToolsProxy.IncrementProgress();

            SKAnimatorToolsProxy.IncrementEnd(model.animationMappings.Length);
            foreach (AnimationMapping animationMapping in model.animationMappings)
            {
                ConfigReference animationRef = animationMapping.animation;
                if (animationRef.IsFileReference())
                {
                    object animationObj = animationRef.ResolveFile();
                    if (animationObj is AnimationConfig animation)
                    {
                        SKAnimatorToolsProxy.SetProgressState(ProgressBarState.ExtraWork);
                        AnimationConfigHandler.HandleAnimationImplementation(animationRef, animationMapping.name, animation, animation.implementation, allModelsAndNodes);
                        SKAnimatorToolsProxy.SetProgressState(ProgressBarState.OK);
                    }
                }
                SKAnimatorToolsProxy.IncrementProgress();
            }

            // 4
            SKAnimatorToolsProxy.IncrementProgress();
        }
示例#15
0
            public void HandleModelConfig(FileInfo sourceFile, ModelConfig baseModel, List <Model3D> modelCollection, DataTreeObject dataTreeParent = null, Transform3D globalTransform = null, Dictionary <string, dynamic> extraData = null)
            {
                Schemed schemed = (Schemed)baseModel.implementation;

                SchemedModel[] models = schemed.models;
                SKAnimatorToolsProxy.IncrementEnd(models.Length);
                foreach (SchemedModel schemedModel in models)
                {
                    // These shouldn't send the extra data over(?)
                    ConfigReferenceUtil.HandleConfigReference(sourceFile, schemedModel.model, modelCollection, dataTreeParent, globalTransform);
                    SKAnimatorToolsProxy.IncrementProgress();
                }
            }
示例#16
0
        /// <summary>
        /// Takes in a <see cref="ComponentModel"/> and loads its data. It then returns the loaded model and all of its descendants as a list of <see cref="Model3D"/> instances.<para/>
        /// WARNING: This will return <see langword="null"/> if the configreference does not reference anything!
        /// </summary>
        /// <param name="sourceFile">The original base-level file that contains the reference.</param>
        /// <param name="model">The reference itself, stored within a <see cref="ComponentModel"/>.</param>
        /// <param name="modelCollection">A list of every model that has been loaded recursively.</param>
        /// <param name="dataTreeParent">For cases where the GUI is used, this is the data tree representation.</param>
        /// <param name="globalTransform">The transformation to apply to all loaded models.</param>
        /// <param name="appendModelsToModelCollection">If true, the loaded models will be appended to <paramref name="modelCollection"/>.</param>
        /// <param name="extraData">Any extra data that should be included. This is mainly used by references (e.g. a reference is a <see cref="StaticSetConfig"/>, the target model in the set may be included as extra data)</param>
        public static List <Model3D> HandleComponentModel(FileInfo sourceFile, ComponentModel model, List <Model3D> modelCollection, DataTreeObject dataTreeParent, Transform3D globalTransform, bool appendModelsToModelCollection = true, Dictionary <string, dynamic> extraData = null)
        {
            if (model == null)
            {
                return(null);
            }
            if (model.model?.getName() == null)
            {
                return(null);
            }

            // This needs to be kept here since it has transform data.

            string filePathRelativeToRsrc = model.model.getName();

            if (filePathRelativeToRsrc.StartsWith("/"))
            {
                filePathRelativeToRsrc = filePathRelativeToRsrc.Substring(1);
            }
            FileInfo referencedModel = new FileInfo(ResourceDirectoryGrabber.ResourceDirectoryPath + filePathRelativeToRsrc);

            if (!referencedModel.Exists)
            {
                throw new ClydeDataReadException($"ConfigReference within model at [{ResourceDirectoryGrabber.GetFormattedPathFromRsrc(sourceFile, false, false, '/')}] attempted to reference [{filePathRelativeToRsrc}], but this file could not be found!");
            }
            List <Model3D> referencedTree = new List <Model3D>();
            Transform3D    newTrs         = model.transform;

            newTrs = globalTransform.compose(newTrs);
            ClydeFileHandler.HandleClydeFile(referencedModel, referencedTree, false, dataTreeParent, false, newTrs, extraData);
            if (appendModelsToModelCollection)
            {
                modelCollection.AddRange(referencedTree);
            }
            return(referencedTree);
        }
示例#17
0
        /// <summary>
        /// Takes in a <see cref="string"/> filepath and loads its data. It then returns the loaded model and all of its descendants as a list of <see cref="Model3D"/> instances.
        /// </summary>
        /// <param name="sourceFile">The original base-level file that contains the reference.</param>
        /// <param name="filePathRelativeToRsrc">The path of the referenced file, relative to the rsrc directory.</param>
        /// <param name="modelCollection">A list of every model that has been loaded recursively.</param>
        /// <param name="dataTreeParent">For cases where the GUI is used, this is the data tree representation.</param>
        /// <param name="globalTransform">The transformation to apply to all loaded models.</param>
        /// <param name="appendModelsToModelCollection">If true, the loaded models will be appended to <paramref name="modelCollection"/>.</param>
        /// <param name="extraData">Any extra data that should be included. This is mainly used by references (e.g. a reference is a <see cref="StaticSetConfig"/>, the target model in the set may be included as extra data)</param>
        private static List <Model3D> HandleConfigReferenceFromLiteralPath(FileInfo sourceFile, string filePathRelativeToRsrc, List <Model3D> modelCollection, DataTreeObject dataTreeParent, Transform3D globalTransform, bool appendModelsToModelCollection = true, Dictionary <string, dynamic> extraData = null)
        {
            if (filePathRelativeToRsrc == null)
            {
                return(null);
            }
            if (filePathRelativeToRsrc.StartsWith("/"))
            {
                filePathRelativeToRsrc = filePathRelativeToRsrc.Substring(1);
            }
            FileInfo referencedModel = new FileInfo(ResourceDirectoryGrabber.ResourceDirectoryPath + filePathRelativeToRsrc);

            if (!referencedModel.Exists)
            {
                throw new ClydeDataReadException($"ConfigReference within model at [{ResourceDirectoryGrabber.GetFormattedPathFromRsrc(sourceFile, false, false, '/')}] attempted to reference [{filePathRelativeToRsrc}], but this file could not be found!");
            }

            List <Model3D> referencedTree = new List <Model3D>();

            ClydeFileHandler.HandleClydeFile(referencedModel, referencedTree, false, dataTreeParent, false, globalTransform, extraData);
            if (appendModelsToModelCollection)
            {
                modelCollection.AddRange(referencedTree);
            }
            return(referencedTree);
        }
        public void HandleModelConfig(FileInfo sourceFile, ModelConfig baseModel, List <Model3D> modelCollection, DataTreeObject dataTreeParent = null, Transform3D globalTransform = null, Dictionary <string, dynamic> extraData = null)
        {
            // ModelConfigHandler.SetupCosmeticInformation(baseModel, dataTreeParent);
            StaticConfig model = (StaticConfig)baseModel.implementation;

            SetupCosmeticInformation(model, dataTreeParent);

            //Model3D mdl = new Model3D();
            MeshSet meshes = model.meshes;

            VisibleMesh[] renderedMeshes = meshes.visible;

            SKAnimatorToolsProxy.IncrementEnd(renderedMeshes.Length);
            int    idx           = 0;
            string depth1Name    = ResourceDirectoryGrabber.GetDirectoryDepth(sourceFile);
            string fullDepthName = ResourceDirectoryGrabber.GetDirectoryDepth(sourceFile, -1);

            foreach (VisibleMesh mesh in renderedMeshes)
            {
                string meshTitle = "-Mesh[" + idx + "]";


                Model3D meshToModel = GeometryConfigTranslator.GetGeometryInformation(mesh.geometry, fullDepthName + meshTitle);
                meshToModel.Name      = depth1Name + meshTitle;
                meshToModel.Transform = meshToModel.Transform.compose(globalTransform).compose(new Transform3D(meshes.bounds.getCenter(), Quaternion.IDENTITY, 1f));
                //meshToModel.Textures.SetFrom(ModelConfigHandler.GetTexturesFromModel(sourceFile, model));
                //meshToModel.Textures.SetFrom(ModelPropertyUtility.FindTexturesFromDirects(baseModel));
                //meshToModel.Textures.SetFrom(new List<string>() { mesh.texture });
                //meshToModel.ActiveTexture = mesh.texture;

                (List <string> textureFiles, string active) = ModelPropertyUtility.FindTexturesAndActiveFromDirects(baseModel, mesh.texture);
                meshToModel.Textures.SetFrom(textureFiles);
                meshToModel.ActiveTexture = active;

                modelCollection.Add(meshToModel);
                idx++;
                SKAnimatorToolsProxy.IncrementProgress();
            }
        }
示例#19
0
        /// <summary>
        /// Sets up the cosmetic data for this model, or, what's displayed in the GUI for the program.<para/>
        /// This specific method populates data that is common across all imported models.
        /// </summary>
        /// <param name="model">The model containing other data, such as the <see cref="Implementation"/>.</param>
        /// <param name="dataTreeParent">This is the instance in the data tree that represents this object in the hierarchy. If null, this method call is skipped.</param>
        /// <param name="dataTreeNameIsImplementation">If <see langword="true"/>, the name of <paramref name="dataTreeParent"/> is the implementation of the model, so the implementation property will not be added.</param>
        public static void SetupCosmeticInformation(ModelConfig model, DataTreeObject dataTreeParent, bool dataTreeNameIsImplementation)
        {
            if (dataTreeParent == null)
            {
                return;
            }
            Implementation impl = model.implementation;

            if (!dataTreeNameIsImplementation)
            {
                // If this is true, the name of the actual node is the implementation, rendering this property useless.

                string implementationName = JavaClassNameStripper.GetWholeClassName(impl.getClass().getName()) ?? "Unknown Implementation";
                dataTreeParent.AddSimpleProperty("Implementation", implementationName.Replace("$", "::"), SilkImage.Config, SilkImage.Config, true);
            }

            // It's imported!
            // ...Unless it's a CompoundConfig. (I mean given the properties below it makes sense, it's just a container, not actual model data.)
            if (impl is Imported imported)
            {
                //RootDataTreeObject.AddSimpleProperty("Scale", model.scale);
                List <object> influences = new List <object>(3);
                if (imported.influences.fog)
                {
                    influences.Add(new DataTreeObjectProperty("Fog", SilkImage.Shading));
                }
                if (imported.influences.lights)
                {
                    influences.Add(new DataTreeObjectProperty("Lights", SilkImage.Light));
                }
                if (imported.influences.projections)
                {
                    influences.Add(new DataTreeObjectProperty("Projections", SilkImage.Texture));
                }
                if (influences.Count > 0)
                {
                    dataTreeParent.AddSimpleProperty("Influenced By...", influences.ToArray(), displaySinglePropertiesInline: false);
                }

                /*
                 * MaterialMapping[] matMaps = imported.materialMappings;
                 * object[] materialProperties = new object[matMaps.Length];
                 * for (int idx = 0; idx < materialProperties.Length; idx++) {
                 *      ConfigReference mtlRef = matMaps[idx].material;
                 *      ConfigReference texCfg = (ConfigReference)mtlRef.getArguments().getOrDefault("Texture", null);
                 *      if (texCfg != null) {
                 *              string texFile = (string)texCfg.getArguments().getOrDefault("File", "?");
                 *              materialProperties[idx] = new DataTreeObjectProperty(texFile, SilkImage.Reference, false);
                 *      } else {
                 *              materialProperties[idx] = matMaps[idx].texture;
                 *      }
                 * }
                 * dataTreeParent.AddSimpleProperty("Textures", materialProperties, SilkImage.Value, SilkImage.Texture, false);
                 */
            }
            List <object> parameters = new List <object>();

            foreach (Parameter prop in model.parameters)
            {
                if (prop is Parameter.Direct direct)
                {
                    DataTreeObject paths = new DataTreeObject {
                        ImageKey = SilkImage.Tag,
                        Text     = "Direct: " + direct.name
                    };
                    int idx = 0;
                    foreach (string path in direct.paths)
                    {
                        paths.AddSimpleProperty("Path " + idx, path);
                        idx++;
                    }
                    parameters.Add(paths);
                }
                else if (prop is Parameter.Choice choice)
                {
                    DataTreeObject choices = new DataTreeObject {
                        ImageKey = SilkImage.Value,
                        Text     = "Choice: " + choice.name + " [Default: " + choice.choice + "]"
                    };
                    List <DataTreeObject> choiceList = new List <DataTreeObject>();
                    foreach (Parameter.Choice.Option option in choice.options)
                    {
                        // choiceList.Add(c);
                        DataTreeObject choiceInfo = new DataTreeObject {
                            ImageKey = SilkImage.Tag,
                            Text     = option.name
                        };
                        ArgumentMap args = option.arguments;
                        object[]    keys = args.keySet().toArray();
                        foreach (object key in keys)
                        {
                            choiceInfo.AddSimpleProperty(key.ToString(), args.get(key));
                        }

                        choiceList.Add(choiceInfo);
                    }
                    choices.AddSimpleProperty("Choices", choiceList.ToArray(), SilkImage.Value, SilkImage.Tag, false);

                    List <DataTreeObject> subDirects = new List <DataTreeObject>();
                    foreach (Parameter.Direct dir in choice.directs)
                    {
                        DataTreeObject dirObj = new DataTreeObject {
                            ImageKey = SilkImage.Tag,
                            Text     = "Direct: " + dir.name
                        };
                        int idx = 0;
                        foreach (string path in dir.paths)
                        {
                            dirObj.AddSimpleProperty("Path " + idx, path);
                            idx++;
                        }
                        subDirects.Add(dirObj);
                    }
                    choices.AddSimpleProperty("Choice Directs", subDirects.ToArray(), SilkImage.Value, SilkImage.Tag, false);
                    parameters.Add(choices);
                }
                else
                {
                    parameters.Add($"{prop.name} [{prop.GetType().FullName}]");
                }
            }
            dataTreeParent.AddSimpleProperty("Parameters", parameters.ToArray(), SilkImage.Value, SilkImage.Tag, false);
        }
示例#20
0
 /// <summary>
 /// Used to register the virtual data tree to the main UI
 /// </summary>
 /// <param name="lastNodeParent"></param>
 /// <param name="rootDataTreeObject"></param>
 public static void RegisterNodes(dynamic lastNodeParent, DataTreeObject rootDataTreeObject)
 {
     UISyncContext?.Send(callback => {
         lastNodeParent.Nodes.Add(rootDataTreeObject.ConvertHierarchyToTreeNodes());
     }, null);
 }
示例#21
0
        public void HandleModelConfig(FileInfo sourceFile, ModelConfig baseModel, List <Model3D> modelCollection, DataTreeObject dataTreeParent = null, Transform3D globalTransform = null, Dictionary <string, dynamic> extraData = null)
        {
            ConditionalConfig model = (ConditionalConfig)baseModel.implementation;

            SetupCosmeticInformation(model, dataTreeParent);


            if (model.defaultModel != null)
            {
                SKAnimatorToolsProxy.IncrementEnd();
                List <Model3D> mdls = ConfigReferenceUtil.HandleConfigReference(sourceFile, model.defaultModel, modelCollection, dataTreeParent, globalTransform, false, extraData);
                if (mdls != null)
                {
                    foreach (Model3D mdl in mdls)
                    {
                        mdl.ExtraData["ConditionalConfigFlag"]    = true;
                        mdl.ExtraData["ConditionalConfigDefault"] = true;
                        if (model.defaultTransform != null)
                        {
                            mdl.Transform = model.defaultTransform;
                        }
                        modelCollection.Add(mdl);
                    }
                }
                SKAnimatorToolsProxy.IncrementProgress();
            }

            SKAnimatorToolsProxy.IncrementEnd(model.cases.Length);
            foreach (ConditionalConfig.Case condition in model.cases)
            {
                List <Model3D> mdls = ConfigReferenceUtil.HandleConfigReference(sourceFile, condition.model, modelCollection, dataTreeParent, globalTransform, false, extraData);
                if (mdls != null)
                {
                    foreach (Model3D mdl in mdls)
                    {
                        mdl.ExtraData["ConditionalConfigFlag"]  = true;
                        mdl.ExtraData["ConditionalConfigValue"] = true;
                        try {
                            bool state = condition.condition.createEvaluator(new DummyScope(model)).evaluate();
                            mdl.ExtraData["ConditionalConfigValue"] = state;
                        } catch { }
                        if (condition.transform != null)
                        {
                            mdl.Transform = condition.transform;
                        }
                        modelCollection.Add(mdl);
                    }
                }
                SKAnimatorToolsProxy.IncrementProgress();
            }
        }
        public void HandleModelConfig(FileInfo sourceFile, ModelConfig baseModel, List <Model3D> modelCollection, DataTreeObject dataTreeParent = null, Transform3D globalTransform = null, Dictionary <string, dynamic> extraData = null)
        {
            MergedStaticConfig mergedStatic = (MergedStaticConfig)baseModel.implementation;

            ComponentModel[] componentModels = mergedStatic.models;
            SKAnimatorToolsProxy.IncrementEnd(componentModels.Length);
            foreach (ComponentModel model in componentModels)
            {
                string filePathRelativeToRsrc = model.model.getName();
                if (filePathRelativeToRsrc.StartsWith("/"))
                {
                    filePathRelativeToRsrc = filePathRelativeToRsrc.Substring(1);
                }
                FileInfo referencedModel = new FileInfo(ResourceDirectoryGrabber.ResourceDirectoryPath + filePathRelativeToRsrc);
                if (!referencedModel.Exists)
                {
                    throw new ClydeDataReadException($"CompoundConfig at [{ResourceDirectoryGrabber.GetFormattedPathFromRsrc(sourceFile, false)}] attempted to reference [{filePathRelativeToRsrc}], but this file could not be found!");
                }
                Transform3D newTrs = model.transform;
                newTrs = globalTransform.compose(newTrs);
                ClydeFileHandler.HandleClydeFile(referencedModel, modelCollection, false, dataTreeParent, transform: newTrs);
                SKAnimatorToolsProxy.IncrementProgress();
            }
        }
        public void HandleEntry(FileInfo sourceFile, Entry entry, List <Model3D> modelCollection, DataTreeObject dataTreeParent = null, Transform3D globalTransform = null)
        {
            PlaceableEntry placeable = (PlaceableEntry)entry;

            SetupCosmeticInformation(placeable, dataTreeParent);

            // TODO: Why the hell does referencing the transform field treat it like a method?
            // Is this some really stupid inheritence problem? I didn't even know this was possible.
            // EDIT: Yeah it is. Entry has a method called "transform", but placeable has a field called "transform". Great.
            // This may have been caused by the transpiler, which is to be expected. I'm actually quite suprised that I've not run into any errors until now.

            SKAnimatorToolsProxy.IncrementEnd();
            // TEST: Is this, by some slim chance, a file ref? (This can happen!)
            if (placeable.placeable.IsRealReference())
            {
                PlaceableConfig[] placeableCfgs = ConfigReferenceBootstrapper.ConfigReferences["placeable"].OfType <PlaceableConfig>().ToArray();
                PlaceableConfig   placeableCfg  = placeableCfgs.GetEntryByName(placeable.placeable.getName());
                if (placeableCfg == null)
                {
                    XanLogger.WriteLine($"Unable to find data for placeable [{placeable.placeable.getName()}]!");
                    return;
                }

                PlaceableConfig.Original originalImpl;
                do
                {
                    if (placeableCfg == null)
                    {
                        XanLogger.WriteLine("ALERT: A placeable was null!", color: System.Drawing.Color.Red);
                        return;
                    }
                    if (placeableCfg.getConfigManager() != null)
                    {
                        originalImpl = placeableCfg.getOriginal(placeableCfg.getConfigManager());
                        break;
                    }
                    else
                    {
                        if (placeableCfg.implementation is PlaceableConfig.Original org)
                        {
                            originalImpl = org;
                            break;
                        }
                        else if (placeableCfg.implementation is PlaceableConfig.Derived der)
                        {
                            placeableCfg = placeableCfgs.GetEntryByName(der.placeable.getName());
                        }
                        else
                        {
                            originalImpl = null;
                            break;
                        }
                    }
                } while (true);
                if (originalImpl != null)
                {
                    Transform3D transform         = GetTransformField(placeable);
                    string      relativeModelPath = originalImpl.model.getName();
                    XanLogger.WriteLine("Grabbing placeable [" + placeable.placeable.getName() + "] at " + relativeModelPath, XanLogger.DEBUG);
                    ConfigReferenceUtil.HandleConfigReference(sourceFile, originalImpl.model, modelCollection, dataTreeParent, globalTransform.compose(transform));
                }
                else
                {
                    XanLogger.WriteLine($"Implementation for placeable [{placeable.placeable.getName()}] does not exist!");
                }
            }
            else
            {
                Transform3D trs = GetTransformField(placeable);
                XanLogger.WriteLine("Grabbing placeable at " + placeable.placeable.getName(), XanLogger.DEBUG);
                ConfigReferenceUtil.HandleConfigReference(sourceFile, placeable.placeable, modelCollection, dataTreeParent, globalTransform.compose(trs));
            }
            SKAnimatorToolsProxy.IncrementProgress();
        }
示例#24
0
        public void HandleModelConfig(FileInfo sourceFile, ModelConfig baseModel, List <Model3D> modelCollection, DataTreeObject dataTreeParent = null, Transform3D globalTransform = null, Dictionary <string, dynamic> extraData = null)
        {
            // ModelConfigHandler.SetupCosmeticInformation(baseModel, dataTreeParent);
            CompoundConfig compound = (CompoundConfig)baseModel.implementation;

            SetupCosmeticInformation(compound, dataTreeParent);

            // NEW: Some stuff uses this trick to pick a specific model out of a compound
            // Parameters contain three key bits of data:
            // 1: Directs (short for Directives) -- These store the values that each option edits.
            // 2: Options -- These are the actual options you can pick, and contain a value for each direct that's been defined for this param
            // 3: Choice -- The currently selected option (or default option)

            ComponentModel[] componentModels = compound.models;
            SKAnimatorToolsProxy.IncrementEnd(componentModels.Length);
            foreach (ComponentModel model in componentModels)
            {
                ConfigReferenceUtil.HandleComponentModel(sourceFile, model, modelCollection, dataTreeParent, globalTransform, true, extraData);
                SKAnimatorToolsProxy.IncrementProgress();
            }
        }
示例#25
0
            public void HandleModelConfig(FileInfo sourceFile, ModelConfig baseModel, List <Model3D> modelCollection, DataTreeObject dataTreeParent = null, Transform3D globalTransform = null, Dictionary <string, dynamic> extraData = null)
            {
                Derived derived = (Derived)baseModel.implementation;

                // Derived implementations need to send the extra data over.
                ConfigReferenceUtil.HandleConfigReference(sourceFile, derived.model, modelCollection, dataTreeParent, globalTransform, extraData: extraData);
            }
示例#26
0
        public void HandleModelConfig(FileInfo sourceFile, ModelConfig baseModel, List <Model3D> modelCollection, DataTreeObject dataTreeParent = null, Transform3D globalTransform = null, Dictionary <string, dynamic> extraData = null)
        {
            ViewerAffecterConfig vac    = (ViewerAffecterConfig)baseModel.implementation;
            ViewerEffectConfig   effect = vac.effect;

            SetupCosmeticInformation(vac, dataTreeParent);

            SKAnimatorToolsProxy.IncrementEnd();
            if (effect is Skybox skybox)
            {
                string filePathRelativeToRsrc = skybox.model?.getName();
                if (filePathRelativeToRsrc != null)
                {
                    // If this is null, it is okay!
                    // Certain implementations, (for instance, schemed implementations) use this to define their render scheme.

                    if (filePathRelativeToRsrc.StartsWith("/"))
                    {
                        filePathRelativeToRsrc = filePathRelativeToRsrc.Substring(1);
                    }
                    FileInfo referencedModel = new FileInfo(ResourceDirectoryGrabber.ResourceDirectoryPath + filePathRelativeToRsrc);
                    if (!referencedModel.Exists)
                    {
                        throw new ClydeDataReadException($"ViewerEffectConfig::Skybox at [{ResourceDirectoryGrabber.GetFormattedPathFromRsrc(sourceFile, false)}] attempted to reference [{filePathRelativeToRsrc}], but this file could not be found!");
                    }

                    // Note to self: DO NOT USE SCALE.
                    // The scale value of skyboxes is used for a parallax effect (the scale = "how much does the skybox move relative to the camera")
                    // Applying this scale is not proper.
                    Transform3D newTrs = new Transform3D(skybox.translationOrigin, Quaternion.IDENTITY);

                    // Now one thing to note is that transforms do NOT affect skyboxes.
                    // As such, the new translation should NOT be affected by the global transform.
                    ClydeFileHandler.HandleClydeFile(referencedModel, modelCollection, false, dataTreeParent, false, newTrs);
                }
            }
            SKAnimatorToolsProxy.IncrementProgress();
        }
示例#27
0
        public void HandleEntry(FileInfo sourceFile, Entry entry, List <Model3D> modelCollection, DataTreeObject dataTreeParent = null, Transform3D globalTransform = null)
        {
            TileEntry tile = (TileEntry)entry;

            //Transform3D trs = new Transform3D();
            //tile.getTransform(tile.getConfig(scene.getConfigManager()), trs);

            SetupCosmeticInformation(tile, dataTreeParent);
            // TODO: Some config references have SK data that I need. I need to do a hybrid of my shallow implementation on
            // top of the bootstrapper that loads the actual filtered game data so that I can grab everything.
            TileConfig[] tileCfgs = ConfigReferenceBootstrapper.ConfigReferences["tile"].OfType <TileConfig>().ToArray();
            TileConfig   tileCfg  = tileCfgs.GetEntryByName(tile.tile.getName());

            if (tileCfg == null)
            {
                XanLogger.WriteLine($"Unable to find data for tile [{tile.tile.getName()}]!");
                return;
            }


            // First things first: Tiles are offset and in the wrong position. Fix it.

            SKAnimatorToolsProxy.IncrementEnd();
            TileConfig.Original originalImpl;
            do
            {
                if (tileCfg == null)
                {
                    XanLogger.WriteLine("ALERT: A tile was null!", color: System.Drawing.Color.Red);
                    return;
                }
                if (tileCfg.getConfigManager() != null)
                {
                    originalImpl = tileCfg.getOriginal(tileCfg.getConfigManager());
                    break;
                }
                else
                {
                    if (tileCfg.implementation is TileConfig.Original original)
                    {
                        originalImpl = original;
                        break;
                    }
                    else if (tileCfg.implementation is TileConfig.Derived derived)
                    {
                        tileCfg = tileCfgs.GetEntryByName(derived.tile.getName());
                    }
                    else
                    {
                        originalImpl = null;
                        break;
                    }
                }
            } while (true);


            //tile.GetExportTransform(originalImpl, out Transform3D transform);
            // All transforms are relative to the center of the object. the origin of the actual models is in their lower-back-left bounds.
            // I need to add a flag to tell the exporter to move the geometry based on bounds center.
            Transform3D transform = new Transform3D();

            tile.getTransform(originalImpl, transform);
            //transform.getTranslation().addLocal(new Vector3f(0, tile.elevation / 2, 0));


            string relativeModelPath = originalImpl.model.getName();

            XanLogger.WriteLine("Grabbing tile [" + tile.tile.getName() + "] at " + relativeModelPath, XanLogger.DEBUG);
            ConfigReferenceUtil.HandleConfigReference(sourceFile, originalImpl.model, modelCollection, dataTreeParent, globalTransform.compose(transform));
            SKAnimatorToolsProxy.IncrementProgress();
        }
示例#28
0
        /// <summary>
        /// Takes in a <see cref="ConfigReference"/> and loads its data. It then returns the loaded model and all of its descendants as a list of <see cref="Model3D"/> instances.
        /// </summary>
        /// <param name="sourceFile">The original base-level file that contains the reference.</param>
        /// <param name="reference">The reference itself.</param>
        /// <param name="modelCollection">A list of every model that has been loaded recursively.</param>
        /// <param name="dataTreeParent">For cases where the GUI is used, this is the data tree representation.</param>
        /// <param name="globalTransform">The transformation to apply to all loaded models.</param>
        /// <param name="appendModelsToModelCollection">If true, the loaded models will be appended to <paramref name="modelCollection"/>.</param>
        /// <param name="extraData">Any extra data that should be included. This is mainly used by references (e.g. a reference is a <see cref="StaticSetConfig"/>, the target model in the set may be included as extra data)</param>
        public static List <Model3D> HandleConfigReference(FileInfo sourceFile, ConfigReference reference, List <Model3D> modelCollection, DataTreeObject dataTreeParent, Transform3D globalTransform, bool appendModelsToModelCollection = true, Dictionary <string, dynamic> extraData = null)
        {
            if (reference == null)
            {
                return(null);
            }
            string filePathRelativeToRsrc = reference.getName();

            if (extraData == null)
            {
                extraData = reference.ArgumentsToExtraData();
            }
            else
            {
                extraData = extraData.MergeWith(reference.ArgumentsToExtraData());
            }
            return(HandleConfigReferenceFromLiteralPath(sourceFile, filePathRelativeToRsrc, modelCollection, dataTreeParent, globalTransform, appendModelsToModelCollection, extraData));
        }
        public void HandleModelConfig(FileInfo sourceFile, ModelConfig baseModel, List <Model3D> modelCollection, DataTreeObject dataTreeParent = null, Transform3D globalTransform = null, Dictionary <string, dynamic> extraData = null)
        {
            StaticSetConfig staticSet = (StaticSetConfig)baseModel.implementation;

            SetupCosmeticInformation(staticSet, dataTreeParent);

            string depth1Name    = ResourceDirectoryGrabber.GetDirectoryDepth(sourceFile);
            string fullDepthName = ResourceDirectoryGrabber.GetDirectoryDepth(sourceFile, -1);

            if (staticSet.meshes != null)
            {
                SKAnimatorToolsProxy.IncrementEnd(staticSet.meshes.size());

                if (extraData != null && extraData.ContainsKey("DirectArgs"))
                {
                    Dictionary <string, dynamic> directs = extraData["DirectArgs"];
                    SKAnimatorToolsProxy.IncrementEnd(1);
                    SKAnimatorToolsProxy.SetProgressState(ProgressBarState.ExtraWork);
                    bool got = false;
                    foreach (string key in directs.Keys)
                    {
                        Parameter param = baseModel.getParameter(key);
                        if (param is Parameter.Direct direct)
                        {
                            if (direct.paths.Contains("implementation.model"))
                            {
                                staticSet.model = directs[key];
                                XanLogger.WriteLine("Set model to " + staticSet.model, XanLogger.DEBUG);
                                SKAnimatorToolsProxy.IncrementProgress();
                                got = true;
                                break;
                            }
                        }
                        else if (param is Parameter.Choice choice)
                        {
                            foreach (Parameter.Direct dir in choice.directs)
                            {
                                if (dir.paths.Contains("implementation.model"))
                                {
                                    staticSet.model = directs[key];
                                    XanLogger.WriteLine("Set model to " + staticSet.model, XanLogger.DEBUG);
                                    SKAnimatorToolsProxy.IncrementProgress();
                                    got = true;
                                    break;
                                }
                            }
                        }
                    }
                    if (!got)
                    {
                        SKAnimatorToolsProxy.IncrementProgress();                           // Just inc anyway
                    }
                }

                // Export them all!
                object[] keys = staticSet.meshes.keySet().toArray();
                SKAnimatorToolsProxy.IncrementEnd(keys.Length);
                foreach (object key in keys)
                {
                    MeshSet       subModel = (MeshSet)staticSet.meshes.get(key);
                    VisibleMesh[] meshes   = subModel.visible;
                    int           idx      = 0;

                    SKAnimatorToolsProxy.IncrementEnd(meshes.Length);
                    foreach (VisibleMesh mesh in meshes)
                    {
                        string meshTitle = "-MeshSets[" + key.ToString() + "].Mesh[" + idx + "]";

                        Model3D meshToModel = GeometryConfigTranslator.GetGeometryInformation(mesh.geometry, fullDepthName + meshTitle);
                        meshToModel.Name = depth1Name + meshTitle;
                        meshToModel.ExtraData["StaticSetEntryName"] = key.ToString();
                        meshToModel.ExtraData["StaticSetConfig"]    = staticSet;
                        if (globalTransform != null)
                        {
                            meshToModel.Transform = globalTransform.compose(meshToModel.Transform);
                        }

                        //meshToModel.Textures.SetFrom(ModelPropertyUtility.FindTexturesFromDirects(baseModel));
                        //meshToModel.ActiveTexture = mesh.texture;

                        (List <string> textureFiles, string active) = ModelPropertyUtility.FindTexturesAndActiveFromDirects(baseModel, mesh.texture);
                        meshToModel.Textures.SetFrom(textureFiles);
                        meshToModel.ActiveTexture = active;

                        modelCollection.Add(meshToModel);
                        idx++;
                        SKAnimatorToolsProxy.IncrementProgress();
                    }

                    SKAnimatorToolsProxy.IncrementProgress();
                }
            }
        }
示例#30
0
        /// <summary>
        /// Sends an arbitrary <see cref="TudeySceneModel"/> into the data brancher and processes it.
        /// </summary>
        /// <param name="sourceFile">The file that the given <see cref="TudeySceneModel"/> came from.</param>
        /// <param name="scene">The <see cref="TudeySceneModel"/> itself.</param>
        /// <param name="models">A list containing every processed model from the entire hierarchy.</param>
        /// <param name="currentDataTreeObject">The current element in the data tree hierarchy to use.</param>
        /// <param name="useImplementation">If <see langword="false"/>, the name of the implementation will be displayed instead of the file name. Additionally, it will not have its implementation property.</param>
        /// <param name="transform">Intended to be used by reference loaders, this specifies an offset for referenced models. All models loaded by this method in the given chain / hierarchy will have this transform applied to them. If the value passed in is <see langword="null"/>, it will be substituted with a new <see cref="Transform3D"/>.</param>
        public static void HandleDataFrom(FileInfo sourceFile, TudeySceneModel scene, List <Model3D> models, DataTreeObject currentDataTreeObject = null, bool useImplementation = false, Transform3D transform = null)
        {
            SetupCosmeticData(scene, currentDataTreeObject);
            XanLogger.WriteLine("Iterating through scene entries...", XanLogger.DEBUG);

            SKAnimatorToolsProxy.IncrementEnd();
            string implName = (JavaClassNameStripper.GetWholeClassName(scene.getClass()) ?? scene.getClass().getTypeName()).Replace("$", "::");

            if (currentDataTreeObject != null)
            {
                if (useImplementation)
                {
                    currentDataTreeObject.Text = implName;
                }
                else
                {
                    currentDataTreeObject.Text = sourceFile.Name;
                }
            }

            object[] entries = scene.getEntries().toArray();
            SKAnimatorToolsProxy.IncrementEnd(entries.Length);
            foreach (object entryObj in entries)
            {
                // Now each entry will be one of three types (at least, in the context that we care about)
                Entry entry = (Entry)entryObj;
                if (entry is TileEntry)
                {
                    TileHandler.Instance.HandleEntry(sourceFile, entry, models, currentDataTreeObject, transform);
                }
                else if (entry is PlaceableEntry)
                {
                    PlaceableHandler.Instance.HandleEntry(sourceFile, entry, models, currentDataTreeObject, transform);
                }
                // Other entry types are more for game data and less for the visual scene (e.g. pathfinding nodes, area markers, etc.)
                SKAnimatorToolsProxy.IncrementProgress();
            }
            SKAnimatorToolsProxy.IncrementProgress();
        }