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; } }
/// <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)); }
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); }
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); }