Example #1
0
            public void OnLoad(AnimationWindow window)
            {
                // Link
                Window = window;
                Asset  = window.Asset;

                // Try to restore target asset import options (useful for fast reimport)
                ModelImportSettings.TryRestore(ref ImportSettings, window.Item.Path);
            }
 public static void AdjustScale(Transform newParent, Bounds bounds, ModelImportSettings setupFlags)
 {
     //If the object's length, width, or height exceeds fitToScale, iteratively shrink the object.
     //TODO: change this to an immediate rescale based on ratios, rather than an iterative one.
     while (bounds.extents.x > setupFlags.fitToScale || bounds.extents.y > setupFlags.fitToScale || bounds.extents.z > setupFlags.fitToScale || bounds.extents.x < -setupFlags.fitToScale || bounds.extents.y < -setupFlags.fitToScale || bounds.extents.z < -setupFlags.fitToScale)
     {
         newParent.transform.localScale *= 0.9f;
         bounds.extents *= 0.9f;
     }
 }
Example #3
0
        /// <summary>
        /// Imports the model asset file to the target location.
        /// </summary>
        /// <param name="inputPath">The source file path.</param>
        /// <param name="outputPath">The result asset file path.</param>
        /// <param name="settings">The settings.</param>
        /// <returns>True if importing failed, otherwise false.</returns>
        public static bool Import(string inputPath, string outputPath, ModelImportSettings settings)
        {
            if (settings == null)
            {
                throw new ArgumentNullException();
            }

            ModelImportSettings.InternalOptions internalOptions;
            settings.ToInternal(out internalOptions);
            return(Internal_ImportModel(inputPath, outputPath, ref internalOptions));
        }
Example #4
0
        public ModelImporter(String modelName, String kclName, float customScale = 1f)
        {
            InitializeComponent();

            Text = "Model Importer - " + Program.AppTitle + " " + Program.AppVersion;

            m_MdlLoaded      = false;
            tbModelName.Text = "None";

            m_BMDName = modelName;
            m_KCLName = kclName;

            m_ImportedModel = new BMD(Program.m_ROM.GetFileFromName(m_BMDName));

            m_ModelImportSettings = m_SavedModelImportSettings.ContainsKey(m_BMDName) ?
                                    m_SavedModelImportSettings[m_BMDName] : new ModelImportSettings(customScale);

            tbScale.Text = m_ModelImportSettings.m_Scale.ToString(Helper.USA);
            txtInGameSizePreview.Text = m_ModelImportSettings.m_InGameModelScale.ToString(Helper.USA);
            if (m_ModelImportSettings.m_InGameModelScale == 1f)
            {
                chkInGamePreview.Checked     = false;
                txtInGameSizePreview.Enabled = false;
            }

            cbGenerateCollision.Checked = m_ModelImportSettings.m_GenerateKCL;
            txtThreshold.Text           = m_ModelImportSettings.m_KCLMinimumFaceSize.ToString(Helper.USA);

            chkAlwaysWriteFullVertexCmd23h.Checked = m_ModelImportSettings.m_ExtraOptions.m_AlwaysWriteFullVertexCmd23h;
            chkStripify.Checked = m_ModelImportSettings.m_ExtraOptions.m_ConvertToTriangleStrips;
            chkKeepVertexOrderDuringStripping.Checked = m_ModelImportSettings.m_ExtraOptions.m_KeepVertexOrderDuringStripping;
            switch (m_ModelImportSettings.m_ExtraOptions.m_TextureQualitySetting)
            {
            case BMDImporter.BMDExtraImportOptions.TextureQualitySetting.SmallestSize:
                rbAlwaysCompress.Checked = true;
                break;

            case BMDImporter.BMDExtraImportOptions.TextureQualitySetting.BetterQualityWhereSensible:
                rbBetterQualityWhereSensible.Checked = true;
                break;

            case BMDImporter.BMDExtraImportOptions.TextureQualitySetting.BestQuality:
                rbNeverCompress.Checked = true;
                break;
            }
            chkVFlipAllTextures.Checked = m_ModelImportSettings.m_ExtraOptions.m_VerticallyFlipAllTextures;

            m_DisplayLists = new int[1];

            glModelView.Initialise();
            glModelView.ProvideDisplayLists(m_DisplayLists);
            glModelView.ProvideScaleRef(ref m_ModelImportSettings.m_Scale);
        }
Example #5
0
        public static bool Import(string inputPath, string outputPath, ModelImportSettings settings)
        {
            if (settings == null)
            {
                throw new ArgumentNullException();
            }
#if UNIT_TEST_COMPILANT
            throw new NotImplementedException("Unit tests, don't support methods calls. Only properties can be get or set.");
#else
            ModelImportSettings.InternalOptions internalOptions;
            settings.ToInternal(out internalOptions);
            return(Internal_ImportModel(inputPath, outputPath, ref internalOptions));
#endif
        }
        /// <summary>
        /// Set up imported objects with colliders, register them to be used accross the network, and set properties from the data received and the setup flags from AssetImportSetupSettings
        /// </summary>
        /// <param name="menuButtonIndex"> index of Menu Button. </param>
        /// <param name="modelData"> custom data received by the network</param>
        /// <param name="loadedObject"> our loaded object</param>
        /// <param name="setupFlags"> setup instructions</param>
        /// <returns></returns>
        public static GameObject SetUpGameObject(int menuButtonIndex, ModelDataTemplate.ModelImportData modelData, GameObject loadedObject, ModelImportSettings setupFlags = null)
        {
            const float defaultFitToScale       = 2;
            const bool  defaultDoSetUpColliders = true;
            const bool  defaultIsNetworked      = true;
            const float defaultModelSpawnHeight = 0.0f;

            if (loadedObject == null)
            {
                throw new System.Exception("Failed to import an model at runtime because the loaded object was null. Please ensure your custom runtime importer properly returns a valid GameObject.");
            }

            if (setupFlags == null)
            {
                setupFlags                  = ScriptableObject.CreateInstance <ModelImportSettings>();
                setupFlags.fitToScale       = defaultFitToScale;
                setupFlags.doSetUpColliders = defaultDoSetUpColliders;
                setupFlags.isNetworked      = defaultIsNetworked;
                setupFlags.spawnHeight      = defaultModelSpawnHeight;
            }

            //parent of model in list
            Transform newParent = new GameObject(menuButtonIndex.ToString()).transform;

            NetworkedGameObject nRGO = default;

            if (setupFlags.isNetworked)
            {
                //set up reference to use with network
                nRGO = NetworkedObjectsManager.Instance.CreateNetworkedGameObject(newParent.gameObject, menuButtonIndex, modelData.id);
            }

            //provide appropriate tag to enable it to be grabbed
            newParent.gameObject.gameObject.tag = TagList.interactable;

            newParent.gameObject.SetActive(false);

            Bounds bounds = new Bounds();

            if (setupFlags.doSetUpColliders)
            {
                SetUpColliders(loadedObject, bounds, newParent, modelData, setupFlags, menuButtonIndex);

                //turn off whole colliders for non-whole objects
                if (!modelData.isWholeObject)
                {
                    SetUpSubObjects(newParent, loadedObject, menuButtonIndex);
                }

                SetUpAnimation(newParent, loadedObject, modelData.isWholeObject);
                AdjustHeight(newParent, setupFlags);
                AdjustScale(newParent, bounds, setupFlags);
            }

            AdjustPose(newParent, modelData, bounds);

            //Initialize fields for ECS
            ConvertObjectsToEntities(nRGO, newParent, menuButtonIndex);

            newParent.gameObject.SetActive(false);

            return(newParent.gameObject);
        }
 public static void AdjustHeight(Transform newParent, ModelImportSettings setupFlags)
 {
     newParent.transform.position = Vector3.up * setupFlags.spawnHeight;
 }
        public static void SetUpColliders(GameObject loadedObject, Bounds bounds, Transform newParent, ModelDataTemplate.ModelImportData modelData, ModelImportSettings setupFlags, int menuButtonIndex)
        {
            //clear subobjectlist for new object processiong
            List <Bounds> subObjectBounds = new List <Bounds>();

            //reset rotation to avoid align axis bounding errors
            loadedObject.transform.rotation = Quaternion.identity;

            //obtain all bounds from skinned mesh renderer and skinned mesh remderer
            CombineMesh(loadedObject.transform, subObjectBounds);

            if (subObjectBounds.Count > 0)
            {
                bounds = new Bounds(subObjectBounds[0].center, Vector3.one * 0.02f);
            }

            //set bounds from all sub-objects
            for (int i = 0; i < subObjectBounds.Count; i++)
            {
                bounds.Encapsulate(new Bounds(subObjectBounds[i].center, subObjectBounds[i].size));
            }

            //set collider properties
            var wholeCollider = newParent.gameObject.AddComponent <BoxCollider>();

            //center the collider to our new parent and send proper size of it based on the renderers picked up
            wholeCollider.center = Vector3.zero;// bounds.center;
            wholeCollider.size   = bounds.size;

            //set parent to be the center of our loaded object to show correct deformations with scalling
            newParent.transform.position = bounds.center;

            loadedObject.transform.SetParent(newParent.transform, true);
        }