private static bool UpdateMesh(CSGModel model, string baseName, GeneratedMeshDescription meshDescription, RenderSurfaceType renderSurfaceType, ref bool outputHasGeneratedNormals, ref Mesh sharedMesh, bool editorOnly = false) { // create our arrays on the C# side with the correct size GeneratedMeshContents generatedMesh; var startGetModelMeshesTime = EditorApplication.timeSinceStartup; { generatedMesh = External.GetModelMesh(model.modelNodeID, meshDescription); if (generatedMesh == null) { return(false); } } getModelMeshesTime += EditorApplication.timeSinceStartup - startGetModelMeshesTime; UpdateMesh(baseName, generatedMesh, meshDescription, renderSurfaceType, ref outputHasGeneratedNormals, ref sharedMesh, editorOnly); return(true); }
private MeshInstanceKey(RenderSurfaceType renderSurfaceType, int subMeshIndex, int meshType, int renderMaterialInstanceID, int physicsMaterialInstanceID) { RenderSurfaceType = renderSurfaceType; SubMeshIndex = subMeshIndex; MeshType = meshType; RenderMaterialInstanceID = renderMaterialInstanceID; PhysicsMaterialInstanceID = physicsMaterialInstanceID; }
public static MeshInstanceKey GenerateKey(RenderSurfaceType renderSurfaceType, Material renderMaterial, PhysicMaterial physicsMaterial) { var realRenderMaterial = renderMaterial; if (renderSurfaceType != RenderSurfaceType.Normal) { realRenderMaterial = null; } return(new MeshInstanceKey(renderSurfaceType, (!realRenderMaterial) ? 1 : realRenderMaterial.GetInstanceID(), (!physicsMaterial) ? 1 : physicsMaterial.GetInstanceID())); }
public void Reset() { RenderMaterial = null; PhysicsMaterial = null; RenderSurfaceType = (RenderSurfaceType)999; HasGeneratedNormals = false; HasUV2 = false; ResetUVTime = float.PositiveInfinity; LightingHashValue = 0; Dirty = true; CachedMeshCollider = null; CachedMeshFilter = null; CachedMeshRenderer = null; CachedMeshRendererSO = null; }
internal static Material GetSurfaceMaterial(RenderSurfaceType renderSurfaceType) { switch (renderSurfaceType) { case RenderSurfaceType.Discarded: return(DiscardedMaterial); case RenderSurfaceType.Invisible: return(InvisibleMaterial); case RenderSurfaceType.Collider: return(ColliderMaterial); case RenderSurfaceType.Trigger: return(TriggerMaterial); case RenderSurfaceType.ShadowOnly: return(ShadowOnlyMaterial); case RenderSurfaceType.Normal: return(null); default: return(null); } }
public static bool UpdateMesh(string baseName, GeneratedMeshContents generatedMesh, GeneratedMeshDescription inputMeshDescription, RenderSurfaceType renderSurfaceType, ref bool outputHasGeneratedNormals, ref Mesh sharedMesh, bool editorOnly) { var startUpdateMeshTime = EditorApplication.timeSinceStartup; { MeshInstanceManager.ClearOrCreateMesh(baseName, editorOnly, ref outputHasGeneratedNormals, ref sharedMesh); // finally, we start filling our (sub)meshes using the C# arrays sharedMesh.vertices = generatedMesh.positions; if (generatedMesh.normals != null) { sharedMesh.normals = generatedMesh.normals; } if (generatedMesh.tangents != null) { sharedMesh.tangents = generatedMesh.tangents; } // if (generatedMesh.colors != null) sharedMesh.colors = generatedMesh.colors; if (generatedMesh.uv0 != null) { sharedMesh.uv = generatedMesh.uv0; } // fill the mesh with the given indices sharedMesh.SetTriangles(generatedMesh.indices, 0, calculateBounds: true); //sharedMesh.RecalculateBounds(); //sharedMesh.bounds = generatedMesh.bounds; // why doesn't this work? } updateMeshTime += EditorApplication.timeSinceStartup - startUpdateMeshTime; if (renderSurfaceType != RenderSurfaceType.Normal) { outputHasGeneratedNormals = ((inputMeshDescription.meshQuery.UsedVertexChannels & VertexChannelFlags.Normal) != 0); } return(true); }
private static bool UpdateMesh(CSGModel model, GeneratedMeshDescription meshDescription, RenderSurfaceType renderSurfaceType, ref GeneratedMeshContents outputGeneratedMeshContents, ref bool outputHasGeneratedNormals, ref Mesh sharedMesh) { // create our arrays on the C# side with the correct size GeneratedMeshContents generatedMesh; var startGetModelMeshesTime = EditorApplication.timeSinceStartup; { generatedMesh = External.GetModelMesh(model.modelNodeID, meshDescription); if (generatedMesh == null) { return(false); } } getModelMeshesTime += EditorApplication.timeSinceStartup - startGetModelMeshesTime; UpdateMesh(generatedMesh, meshDescription, renderSurfaceType, ref outputHasGeneratedNormals, ref sharedMesh); /* #if UNITY_2018_3_OR_NEWER * var modelGameObject = model.gameObject; * var prefabStage = UnityEditor.Experimental.SceneManagement.PrefabStageUtility.GetPrefabStage(modelGameObject); * if (prefabStage != null && string.IsNullOrEmpty(AssetDatabase.GetAssetPath(sharedMesh))) * { * var prefabAssetPath = prefabStage.prefabAssetPath; * if (!string.IsNullOrEmpty(prefabAssetPath)) * AssetDatabase.AddObjectToAsset(sharedMesh, prefabAssetPath); * UnityEditor.SceneManagement.EditorSceneManager.MarkSceneDirty(modelGameObject.scene); * } #endif */ outputGeneratedMeshContents = generatedMesh; return(true); }
internal static Material GetSurfaceMaterial(RenderSurfaceType renderSurfaceType) { switch (renderSurfaceType) { case RenderSurfaceType.Hidden: return(HiddenMaterial); case RenderSurfaceType.Culled: return(CulledMaterial); case RenderSurfaceType.Collider: return(ColliderMaterial); case RenderSurfaceType.Trigger: return(TriggerMaterial); case RenderSurfaceType.ShadowOnly: return(ShadowOnlyMaterial); case RenderSurfaceType.CastShadows: return(CastShadowsMaterial); case RenderSurfaceType.ReceiveShadows: return(ReceiveShadowsMaterial); case RenderSurfaceType.Normal: return(null); default: return(null); } }
private static HelperSurfaceDescription GenerateHelperSurfaceDescription(GeneratedMeshes meshContainer, CSGModel model, ModelSettingsFlags modelSettings, GeneratedMeshDescription meshDescription, RenderSurfaceType renderSurfaceType) { HelperSurfaceDescription helperSurfaceDescription = MeshInstanceManager.CreateHelperSurfaceDescription(meshContainer, modelSettings, meshDescription, renderSurfaceType); helperSurfaceDescription.MeshDescription = meshDescription; if (!UpdateMesh(model, renderSurfaceMeshNames[(int)renderSurfaceType], helperSurfaceDescription.MeshDescription, helperSurfaceDescription.RenderSurfaceType, ref helperSurfaceDescription.HasGeneratedNormals, ref helperSurfaceDescription.SharedMesh, editorOnly: true)) { return(null); } return(helperSurfaceDescription); }
private static bool TryGetHelperSurfaceDescription(GeneratedMeshes meshContainer, CSGModel model, ModelSettingsFlags modelSettings, GeneratedMeshDescription meshDescription, RenderSurfaceType renderSurfaceType, out HelperSurfaceDescription helperSurfaceDescription) { var startGetMeshInstanceTime = EditorApplication.timeSinceStartup; helperSurfaceDescription = MeshInstanceManager.GetHelperSurfaceDescription(meshContainer, modelSettings, meshDescription, renderSurfaceType); getMeshInstanceTime += EditorApplication.timeSinceStartup - startGetMeshInstanceTime; if (helperSurfaceDescription != null && meshDescription == helperSurfaceDescription.MeshDescription && helperSurfaceDescription.SharedMesh && helperSurfaceDescription.IsValid()) { return(true); } helperSurfaceDescription = null; return(true); }
private static GeneratedMeshInstance GenerateMeshInstance(GeneratedMeshes meshContainer, CSGModel model, ModelSettingsFlags modelSettings, GeneratedMeshDescription meshDescription, RenderSurfaceType renderSurfaceType, List <GameObject> unusedInstances) { GeneratedMeshInstance meshInstance = MeshInstanceManager.CreateMeshInstance(meshContainer, meshDescription, modelSettings, renderSurfaceType, unusedInstances); string baseName; switch (renderSurfaceType) { case RenderSurfaceType.Collider: baseName = "Collider"; break; case RenderSurfaceType.Normal: baseName = "Renderable"; break; default: baseName = "Unknown"; break; } meshInstance.MeshDescription = meshDescription; if (!UpdateMesh(model, baseName, meshInstance.MeshDescription, meshInstance.RenderSurfaceType, ref meshInstance.HasGeneratedNormals, ref meshInstance.SharedMesh)) { return(null); } return(meshInstance); }
private static bool TryGetMeshInstance(GeneratedMeshes meshContainer, CSGModel model, ModelSettingsFlags modelSettings, GeneratedMeshDescription meshDescription, RenderSurfaceType renderSurfaceType, out GeneratedMeshInstance meshInstance) { var startGetMeshInstanceTime = EditorApplication.timeSinceStartup; meshInstance = MeshInstanceManager.GetMeshInstance(meshContainer, meshDescription, modelSettings, renderSurfaceType); getMeshInstanceTime += EditorApplication.timeSinceStartup - startGetMeshInstanceTime; if (meshInstance && meshDescription == meshInstance.MeshDescription && meshInstance.SharedMesh && meshInstance.IsValid()) { return(true); } meshInstance = null; return(true); }
private static HelperSurfaceDescription GenerateHelperSurfaceDescription(GeneratedMeshes meshContainer, CSGModel model, ModelSettingsFlags modelSettings, GeneratedMeshDescription meshDescription, RenderSurfaceType renderSurfaceType) { HelperSurfaceDescription helperSurfaceDescription; var startGetMeshInstanceTime = EditorApplication.timeSinceStartup; { helperSurfaceDescription = MeshInstanceManager.GetHelperSurfaceDescription(meshContainer, modelSettings, meshDescription, renderSurfaceType); } getMeshInstanceTime += EditorApplication.timeSinceStartup - startGetMeshInstanceTime; if (meshDescription == helperSurfaceDescription.MeshDescription && helperSurfaceDescription.SharedMesh && helperSurfaceDescription.IsValid()) { return(helperSurfaceDescription); } helperSurfaceDescription.MeshDescription = meshDescription; if (!UpdateMesh(model, helperSurfaceDescription.MeshDescription, helperSurfaceDescription.RenderSurfaceType, ref helperSurfaceDescription.HasGeneratedNormals, ref helperSurfaceDescription.SharedMesh)) { return(null); } return(helperSurfaceDescription); }
private static GeneratedMeshInstance GenerateMeshInstance(GeneratedMeshes meshContainer, CSGModel model, ModelSettingsFlags modelSettings, GeneratedMeshDescription meshDescription, RenderSurfaceType renderSurfaceType) { GeneratedMeshInstance meshInstance; var startGetMeshInstanceTime = EditorApplication.timeSinceStartup; { meshInstance = MeshInstanceManager.GetMeshInstance(meshContainer, meshDescription, modelSettings, renderSurfaceType); if (!meshInstance) { return(null); } } getMeshInstanceTime += EditorApplication.timeSinceStartup - startGetMeshInstanceTime; if (meshDescription == meshInstance.MeshDescription && meshInstance.SharedMesh && meshInstance.IsValid()) { return(meshInstance); } meshInstance.MeshDescription = meshDescription; if (!UpdateMesh(model, meshInstance.MeshDescription, meshInstance.RenderSurfaceType, ref meshInstance.HasGeneratedNormals, ref meshInstance.SharedMesh)) { return(null); } return(meshInstance); }
private MeshInstanceKey(RenderSurfaceType renderSurfaceType, int renderMaterialInstanceID, int physicsMaterialInstanceID) { RenderSurfaceType = renderSurfaceType; RenderMaterialInstanceID = renderMaterialInstanceID; PhysicsMaterialInstanceID = physicsMaterialInstanceID; }