public void CreateWMOObject() { WMO.WMOData data = WMO.AllWMOData.Dequeue(); GameObject WMOinstance = new GameObject(); terrainHandler.LoadedWMOs[data.dataPath] = WMOinstance; try { int nGroups = data.Info.nGroups; for (int g = 0; g < nGroups; g++) { // object // GameObject GroupInstance = new GameObject(); GroupInstance.transform.SetParent(terrainHandler.LoadedWMOs[data.dataPath].transform); GroupInstance.name = data.groupsData[g].groupName; for (int bn = 0; bn < data.groupsData[g].nBatches; bn++) { // object // GameObject BatchInstance = new GameObject(); BatchInstance.transform.SetParent(GroupInstance.transform); BatchInstance.name = bn.ToString(); BatchInstance.transform.transform.eulerAngles = new Vector3(BatchInstance.transform.transform.eulerAngles.x, BatchInstance.transform.transform.eulerAngles.y - 180, GroupInstance.transform.transform.eulerAngles.z); // mesh // BatchInstance.AddComponent <MeshRenderer>(); BatchInstance.AddComponent <MeshFilter>(); Mesh bmesh = new Mesh(); int batchVertSize = (int)((data.groupsData[g].batch_EndVertex[bn] - data.groupsData[g].batch_StartVertex[bn]) + 1); Vector3[] batchVertices = new Vector3[batchVertSize]; Vector2[] batchUVs = new Vector2[batchVertSize]; Vector3[] batchNormals = new Vector3[batchVertSize]; Color32[] batchVertexColors = new Color32[batchVertSize]; List <int> batchTrianglesList = new List <int>(); int[] batchTriangles; int arrayPosition = 0; uint batch_startVertex = data.groupsData[g].batch_StartVertex[bn]; uint batch_endVertex = data.groupsData[g].batch_EndVertex[bn]; for (uint v = batch_startVertex; v <= batch_endVertex; v++) { batchVertices[arrayPosition] = data.groupsData[g].vertices[v]; batchUVs[arrayPosition] = data.groupsData[g].UVs[v]; batchNormals[arrayPosition] = data.groupsData[g].normals[v]; if (!data.groupsData[g].flags.Hasvertexolors) { batchVertexColors[arrayPosition] = new Color32(127, 127, 127, 127); } else { batchVertexColors[arrayPosition] = data.groupsData[g].vertexColors[(int)v]; } arrayPosition++; } uint batch_startIndex = data.groupsData[g].batch_StartIndex[bn]; uint batch_nIndices = data.groupsData[g].batch_nIndices[bn]; for (uint idx = batch_startIndex; idx <= batch_startIndex + batch_nIndices - 2; idx = idx + 3) { uint in1 = data.groupsData[g].triangles[idx + 0]; uint in2 = data.groupsData[g].triangles[idx + 1]; uint in3 = data.groupsData[g].triangles[idx + 2]; int a = (int)(in1 - batch_startVertex); int b = (int)(in2 - batch_startVertex); int c = (int)(in3 - batch_startVertex); batchTrianglesList.Add(a); batchTrianglesList.Add(b); batchTrianglesList.Add(c); } batchTrianglesList.Reverse(); batchTriangles = batchTrianglesList.ToArray(); bmesh.vertices = batchVertices; bmesh.uv = batchUVs; bmesh.normals = batchNormals; bmesh.triangles = batchTriangles; bmesh.colors32 = batchVertexColors; BatchInstance.GetComponent <MeshFilter>().mesh = bmesh; BatchInstance.GetComponent <MeshRenderer>().sharedMaterial = missingMaterial; // material // string textureName = data.texturePaths[data.materials[data.groupsData[g].batchMaterialIDs[bn]].texture1_offset]; if (LoadedWMOTextures.ContainsKey(textureName)) { BatchInstance.GetComponent <Renderer>().material.SetTexture("_MainTex", LoadedWMOTextures[textureName]); } else { Texture2Ddata tdata = data.textureData[textureName]; Texture2D tex = new Texture2D(tdata.width, tdata.height, tdata.textureFormat, tdata.hasMipmaps); tex.LoadRawTextureData(tdata.TextureData); tex.Apply(); LoadedWMOTextures[textureName] = tex; BatchInstance.GetComponent <Renderer>().material.SetTexture("_MainTex", tex); } } } terrainHandler.LoadedWMOs[data.dataPath].transform.position = data.position; terrainHandler.LoadedWMOs[data.dataPath].transform.rotation = data.rotation; terrainHandler.LoadedWMOs[data.dataPath].transform.localScale = data.scale; terrainHandler.LoadedWMOs[data.dataPath].transform.SetParent(terrainHandler.ADTBlockWMOParents[data.uniqueID].transform); terrainHandler.LoadedWMOs[data.dataPath].name = data.Info.wmoID.ToString(); } catch { Debug.Log("Error : Trying to Create WMO Object - " + data.dataPath); } }
public void CreateWMOObject() { if (terrainHandler.working) { WMO.WMOData data = WMO.AllWMOData.Dequeue(); GameObject WMOinstance = new GameObject(); terrainHandler.LoadedWMOs[data.dataPath] = WMOinstance; int nGroups = data.Info.nGroups; for (int g = 0; g < nGroups; g++) { // group object // GameObject GroupInstance = new GameObject(); GroupInstance.isStatic = true; GroupInstance.transform.SetParent(terrainHandler.LoadedWMOs[data.dataPath].transform); GroupInstance.name = data.groupsData[g].groupName; LODGroup Lodgroup = GroupInstance.AddComponent <LODGroup>(); LOD[] lods = new LOD[1]; Renderer[] renderers = new Renderer[data.groupsData[g].nBatches]; // Batches // for (int bn = 0; bn < data.groupsData[g].nBatches; bn++) { //////////////////////////////// #region object GameObject BatchInstance = new GameObject(); BatchInstance.isStatic = true; BatchInstance.transform.SetParent(GroupInstance.transform); BatchInstance.name = bn.ToString(); BatchInstance.transform.transform.eulerAngles = new Vector3(BatchInstance.transform.transform.eulerAngles.x, BatchInstance.transform.transform.eulerAngles.y - 180, GroupInstance.transform.transform.eulerAngles.z); #endregion //////////////////////////////// //////////////////////////////// #region mesh BatchInstance.AddComponent <MeshRenderer>(); BatchInstance.GetComponent <MeshRenderer>().shadowCastingMode = UnityEngine.Rendering.ShadowCastingMode.TwoSided; renderers[bn] = BatchInstance.GetComponent <MeshRenderer>(); BatchInstance.AddComponent <MeshFilter>(); Mesh bmesh = new Mesh(); int batchVertSize = (int)((data.groupsData[g].batch_EndVertex[bn] - data.groupsData[g].batch_StartVertex[bn]) + 1); Vector3[] batchVertices = new Vector3[batchVertSize]; Vector2[] batchUVs = new Vector2[batchVertSize]; Vector3[] batchNormals = new Vector3[batchVertSize]; Color32[] batchVertexColors = new Color32[batchVertSize]; List <int> batchTrianglesList = new List <int>(); int[] batchTriangles; int arrayPosition = 0; uint batch_startVertex = data.groupsData[g].batch_StartVertex[bn]; uint batch_endVertex = data.groupsData[g].batch_EndVertex[bn]; for (uint v = batch_startVertex; v <= batch_endVertex; v++) { batchVertices[arrayPosition] = data.groupsData[g].vertices[v]; batchUVs[arrayPosition] = data.groupsData[g].UVs[v]; batchNormals[arrayPosition] = data.groupsData[g].normals[v]; if (!data.groupsData[g].flags.Hasvertexolors) { batchVertexColors[arrayPosition] = new Color32(127, 127, 127, 127); } else { batchVertexColors[arrayPosition] = data.groupsData[g].vertexColors[(int)v]; } arrayPosition++; } uint batch_startIndex = data.groupsData[g].batch_StartIndex[bn]; uint batch_nIndices = data.groupsData[g].batch_nIndices[bn]; for (uint idx = batch_startIndex; idx <= batch_startIndex + batch_nIndices - 2; idx = idx + 3) { uint in1 = data.groupsData[g].triangles[idx + 0]; uint in2 = data.groupsData[g].triangles[idx + 1]; uint in3 = data.groupsData[g].triangles[idx + 2]; int a = (int)(in1 - batch_startVertex); int b = (int)(in2 - batch_startVertex); int c = (int)(in3 - batch_startVertex); batchTrianglesList.Add(a); batchTrianglesList.Add(b); batchTrianglesList.Add(c); } batchTrianglesList.Reverse(); batchTriangles = batchTrianglesList.ToArray(); bmesh.vertices = batchVertices; bmesh.uv = batchUVs; bmesh.normals = batchNormals; bmesh.triangles = batchTriangles; bmesh.colors32 = batchVertexColors; BatchInstance.GetComponent <MeshFilter>().mesh = bmesh; BatchInstance.GetComponent <MeshRenderer>().sharedMaterial = missingMaterial; #endregion //////////////////////////////// //////////////////////////////// #region material string textureName = data.texturePaths[data.materials[data.groupsData[g].batchMaterialIDs[bn]].texture1_offset]; BatchInstance.GetComponent <Renderer>().material = WMOmaterials[data.materials[data.groupsData[g].batchMaterialIDs[bn]].shader]; //////////////////////////////// #region Set Fragment Shader int shader = data.materials[data.groupsData[g].batchMaterialIDs[bn]].shader; switch (shader) { case (int)WMOFragmentShader.Diffuse: { BatchInstance.GetComponent <Renderer>().material.SetFloat("_ShaderDiffuse", 1.0f); break; } case (int)WMOFragmentShader.Specular: { BatchInstance.GetComponent <Renderer>().material.SetFloat("_ShaderSpecular", 1.0f); break; } case (int)WMOFragmentShader.Metal: { BatchInstance.GetComponent <Renderer>().material.SetFloat("_ShaderMetal", 1.0f); break; } case (int)WMOFragmentShader.Env: { BatchInstance.GetComponent <Renderer>().material.SetFloat("_ShaderEnv", 1.0f); break; } case (int)WMOFragmentShader.Opaque: { BatchInstance.GetComponent <Renderer>().material.SetFloat("_ShaderOpaque", 1.0f); BatchInstance.GetComponent <Renderer>().material.SetFloat("_AlphaToMask", 1.0f); break; } default: { BatchInstance.GetComponent <Renderer>().material.SetFloat("_ShaderDiffuse", 1.0f); break; } } #endregion //////////////////////////////// //////////////////////////////// #region Set Material Flags // F_UNCULLED // int Culling = 2; // on (only front) if (data.materials[data.groupsData[g].batchMaterialIDs[bn]].flags.F_UNCULLED) { Culling = 0; // off (both sides_ } BatchInstance.GetComponent <Renderer>().material.SetFloat("F_UNCULLED", Culling); // F_UNLIT // if (data.materials[data.groupsData[g].batchMaterialIDs[bn]].flags.F_UNLIT) { BatchInstance.GetComponent <Renderer>().material.EnableKeyword("F_UNLIT"); } //BatchInstance.GetComponent<Renderer>().material.SetFloat("_F_UNLIT", data.materials[data.groupsData[g].batchMaterialIDs[bn]].flags.F_UNLIT ? 1 : 0); // F_UNFOGGED // BatchInstance.GetComponent <Renderer>().material.SetFloat("_F_UNFOGGED", data.materials[data.groupsData[g].batchMaterialIDs[bn]].flags.F_UNFOGGED ? 1 : 0); #endregion //////////////////////////////// //////////////////////////////// #region Set Blending Mode // set default blend: One Zero, basicly off UnityEngine.Rendering.BlendMode source = UnityEngine.Rendering.BlendMode.One; UnityEngine.Rendering.BlendMode destination = UnityEngine.Rendering.BlendMode.Zero; BlendingMode blending = data.materials[data.groupsData[g].batchMaterialIDs[bn]].blendMode; switch (blending) { case BlendingMode.Opaque: { source = UnityEngine.Rendering.BlendMode.One; destination = UnityEngine.Rendering.BlendMode.Zero; break; } case BlendingMode.AlphaKey: { source = UnityEngine.Rendering.BlendMode.One; destination = UnityEngine.Rendering.BlendMode.Zero; break; } case BlendingMode.Alpha: { source = UnityEngine.Rendering.BlendMode.SrcAlpha; destination = UnityEngine.Rendering.BlendMode.OneMinusSrcAlpha; break; } case BlendingMode.Additive: { source = UnityEngine.Rendering.BlendMode.One; destination = UnityEngine.Rendering.BlendMode.One; break; } case BlendingMode.Modulate: { source = UnityEngine.Rendering.BlendMode.DstColor; destination = UnityEngine.Rendering.BlendMode.Zero; break; } case BlendingMode.Modulate2x: { source = UnityEngine.Rendering.BlendMode.DstColor; destination = UnityEngine.Rendering.BlendMode.SrcColor; break; } case BlendingMode.ModulateAdditive: { source = UnityEngine.Rendering.BlendMode.DstColor; destination = UnityEngine.Rendering.BlendMode.One; break; } default: { Debug.Log("BlendMode To Add: " + blending.ToString() + " Texture Used: " + textureName); source = UnityEngine.Rendering.BlendMode.One; destination = UnityEngine.Rendering.BlendMode.Zero; break; } } BatchInstance.GetComponent <Renderer>().material.SetInt("MySrcMode", (int)source); BatchInstance.GetComponent <Renderer>().material.SetInt("MyDstMode", (int)destination); #endregion //////////////////////////////// //////////////////////////////// #region Assign Textures if (LoadedWMOTextures.ContainsKey(textureName)) { BatchInstance.GetComponent <Renderer>().material.SetTexture("_MainTex", LoadedWMOTextures[textureName]); } else { try { Texture2Ddata tdata = data.textureData[textureName]; Texture2D tex = new Texture2D(tdata.width, tdata.height, tdata.textureFormat, tdata.hasMipmaps); tex.LoadRawTextureData(tdata.TextureData); tex.Apply(); LoadedWMOTextures[textureName] = tex; BatchInstance.GetComponent <Renderer>().material.SetTexture("_MainTex", tex); } catch { Debug.Log("Error: Loading RawTextureData @ WMOhandler"); } } #endregion //////////////////////////////// #endregion //////////////////////////////// } lods[0] = new LOD(.1f, renderers); Lodgroup.SetLODs(lods); Lodgroup.animateCrossFading = true; Lodgroup.fadeMode = LODFadeMode.SpeedTree; Lodgroup.RecalculateBounds(); } terrainHandler.LoadedWMOs[data.dataPath].transform.position = data.position; terrainHandler.LoadedWMOs[data.dataPath].transform.rotation = data.rotation; terrainHandler.LoadedWMOs[data.dataPath].transform.localScale = data.scale; if (data.uniqueID != -1) { if (terrainHandler.ADTBlockWMOParents[data.uniqueID] != null) { terrainHandler.LoadedWMOs[data.dataPath].transform.SetParent(terrainHandler.ADTBlockWMOParents[data.uniqueID].transform); } else { Destroy(terrainHandler.LoadedWMOs[data.dataPath]); } } terrainHandler.LoadedWMOs[data.dataPath].name = data.Info.wmoID.ToString(); terrainHandler.frameBusy = false; } }