void Remove(tmTextureRenderBase render) { if (renderRefs.Remove(render)) { RetainCount--; } }
void Add(tmTextureRenderBase render) { if (renderRefs.Add(render)) { RetainCount++; } }
public tmBatchedInstance BatchObject(tmBatchObject bo, Transform root, bool move = true) { if (bo.BatchInstance != null || bo.Mesh == null || bo.Material == null) { CustomDebug.LogError("invalid batch object : " + bo.name + " reason: instance:" + (bo.BatchInstance != null) + ", mesh:" + (bo.Mesh == null) + ", material:" + (bo.Material == null), bo); return(null); } move = root == null; if (root == null) { root = transform; } bool needSkin = (bo.BatchingType == tmBatchingType.Skinning); string key = "" + root.GetInstanceID() + bo.Material.GetInstanceID() + needSkin; List <tmBatchedInstance> batches = null; if (batchTable.ContainsKey(key)) { batches = batchTable[key]; } else { batches = new List <tmBatchedInstance>(); batchTable.Add(key, batches); } tmBatchedInstance availibleBatch = null; foreach (tmBatchedInstance batch in batches) { if (batch.CanAdd(bo)) { availibleBatch = batch; break; } } if (availibleBatch == null) { GameObject go = new GameObject(); go.transform.parent = root; go.transform.localPosition = Vector3.zero; go.name = "Batch_" + root.name + "_" + bo.Material.name.Replace(tk2dSpriteCollectionData.internalResourcePrefix, "") + "_" + needSkin; go.layer = bo.gameObject.layer; availibleBatch = needSkin ? go.AddComponent <tmSkinnedBatchedInstance>() : go.AddComponent <tmBatchedInstance>(); availibleBatch.shouldMove = move; availibleBatch.SharedMaterial = bo.Material; tmTextureRenderBase original = bo.GetComponent <tmTextureRenderBase>(); if (original) { tmBatchRender render = go.AddComponent <tmBatchRender>(); render.MainTexCollectionGUID = original.MainTexCollectionGUID; render.MainTextureID = original.MainTextureID; render.LightmapCollectionGUID = original.LightmapCollectionGUID; render.LightmapTextureID = original.LightmapTextureID; render.Material = original.Material; } batches.Add(availibleBatch); availibleBatch.OnDestroyEvent += () => batches.Remove(availibleBatch); } if (availibleBatch != null) { availibleBatch.Add(bo); } return(availibleBatch); }
public static void Convert(GameObject target) { // GameObject target = Selection.activeGameObject; Mesh mesh = null; MeshFilter mf = target.GetComponent <MeshFilter>(); bool isSkinned = false; if (mf != null) { mesh = mf.sharedMesh; } else { SkinnedMeshRenderer smr = target.GetComponent <SkinnedMeshRenderer>(); if (smr != null) { isSkinned = true; mesh = smr.sharedMesh; } } int index = 0; for (int i = 0; i < target.GetComponent <Renderer>().sharedMaterials.Length; i++) { Material mat = target.GetComponent <Renderer>().sharedMaterials[i]; Texture main = mat.mainTexture; Texture lightmap = mat.GetLightmapTexture(); if (mat.name.Equals("Shadows_LOW")) { main = AssetUtility.GetAssetsAtPath <Texture2D>("Obstacles/Shadow_LOW")[0]; mat = AssetUtility.GetAssetsAtPath <Material>("Materials/Shadows")[0]; } if (mat.name.Equals("Shadows_MEDIUM")) { main = AssetUtility.GetAssetsAtPath <Texture2D>("Obstacles/Shadow_MEDIUM")[0]; mat = AssetUtility.GetAssetsAtPath <Material>("Materials/Shadows")[0]; } GameObject g = null; if (!isSkinned && target.GetComponent <Renderer>().sharedMaterials.Length > 1) { g = new GameObject(target.name + index, typeof(MeshRenderer), typeof(MeshFilter)); g.name = target.name + index; g.transform.parent = target.transform; g.transform.localPosition = Vector3.zero; g.transform.localScale = Vector3.one; g.transform.localRotation = Quaternion.identity; } else { g = target; } tmTextureRenderBase render = null; g.GetComponent <Renderer>().sharedMaterial = mat; if (g.GetComponent <ParticleSystem>()) { render = g.AddComponent <tmParticleSystemRender>(); } if (main != null) { string path = AssetDatabase.GetAssetPath(main); tmTextureCollectionIndex inst = tmIndex.Instance.CollectionIndexForTexturePath(path); if (inst != null) { if (render == null) { render = g.AddComponent <tmTextureRender>(); } render.MainTexCollectionGUID = inst.textureCollectionGUID; render.MainTextureID = render.MainTexCollection.GetTextureDefenitionByName(main.name).textureGuid; } } if (lightmap != null) { string path = AssetDatabase.GetAssetPath(lightmap); tmTextureCollectionIndex inst = tmIndex.Instance.CollectionIndexForTexturePath(path); if (inst != null) { if (render == null) { render = g.AddComponent <tmTextureRender>(); } render.LightmapCollectionGUID = inst.textureCollectionGUID; render.LightmapTextureID = render.LightmapCollection.GetTextureDefenitionByName(lightmap.name).textureGuid; } } if (target.GetComponent <Renderer>().sharedMaterials.Length == 1) { SetSharedMesh(g, mesh); if (render != null) { render.Mesh = mesh; } } else if (mesh != null) { string meshName = mesh.name + "_" + index; string[] guids = AssetDatabase.FindAssets(meshName); if (guids.Length > 0) { int indexCount = mesh.GetIndices(index).Length; Object[] meshes = AssetDatabase.LoadAllAssetsAtPath(AssetDatabase.GUIDToAssetPath(guids[0])); foreach (Object submesh in meshes) { Mesh subm = submesh as Mesh; if (subm != null) { if (subm.GetIndices(0).Length == indexCount) { SetSharedMesh(g, subm); if (render != null) { render.Mesh = subm; } g.name = subm.name; } } } } } if (render != null) { render.Material = tmMaterialUtility.SharedMaterial(mat); } { tmBatchObject bb = g.GetComponent <tmBatchObject>(); if (bb == null) { bb = g.AddComponent <tmBatchObject>(); } bb.SetUp(); } index++; } }