private void InitGameObject() { gao = new GameObject(name); /*System.Diagnostics.Stopwatch w = new System.Diagnostics.Stopwatch(); * w.Start();*/ gao.tag = "Visual"; gao.layer = LayerMask.NameToLayer("Visual"); if (bones != null) { GameObject child = bones.Gao; child.transform.SetParent(gao.transform); child.transform.localPosition = Vector3.zero; } for (uint i = 0; i < num_elements; i++) { if (elements[i] != null) { GameObject child = elements[i].Gao; child.transform.SetParent(gao.transform); child.transform.localPosition = Vector3.zero; } } if (lookAtMode != 0) { BillboardBehaviour billboard = gao.AddComponent <BillboardBehaviour>(); billboard.mode = (BillboardBehaviour.LookAtMode)lookAtMode; } /*MapLoader.Loader.print("GEO: " + offset + " - " + w.ElapsedMilliseconds); * w.Stop();*/ }
public void InitGameObject() { gao = new GameObject(name); gao.tag = "Visual"; gao.layer = LayerMask.NameToLayer("Visual"); if (bones != null) { GameObject child = bones.Gao; child.transform.SetParent(gao.transform); child.transform.localPosition = Vector3.zero; } for (uint i = 0; i < num_elements; i++) { if (elements[i] != null) { GameObject child = elements[i].Gao; child.transform.SetParent(gao.transform); child.transform.localPosition = Vector3.zero; } } if (lookAtMode != 0) { BillboardBehaviour billboard = gao.AddComponent <BillboardBehaviour>(); billboard.mode = (BillboardBehaviour.LookAtMode)lookAtMode; } }
public GameObject GetGameObject(GeometricObject.Type type, GeometricObject go, CollideType collideType = CollideType.None) { GameObject gao = null; if (type == GeometricObject.Type.Collide) { gao = new GameObject("Element Spheres @ " + Offset); gao.layer = LayerMask.NameToLayer("Collide"); gao.transform.localPosition = Vector3.zero; if (spheres.Value != null) { Vector3[] verts = go.verticesCollide.Value?.GetVectors(go.ScaleFactor); GeometricObjectElementCollideSphereArray.GeometricElementCollideSphere[] sphere = spheres.Value.spheres; for (int i = 0; i < num_spheres; i++) { GameObject sphere_gao = GameObject.CreatePrimitive(PrimitiveType.Sphere); sphere_gao.name = "Sphere " + i; sphere_gao.transform.SetParent(gao.transform); MeshRenderer mr = sphere_gao.GetComponent <MeshRenderer>(); sphere_gao.transform.localPosition = verts[sphere[i].centerPoint]; sphere_gao.transform.localScale = Vector3.one * sphere[i].radius * 2; // default Unity sphere radius is 0.5 sphere_gao.layer = LayerMask.NameToLayer("Collide"); BillboardBehaviour bill = sphere_gao.AddComponent <BillboardBehaviour>(); bill.mode = BillboardBehaviour.LookAtMode.CameraPosXYZ; mr.material = MapLoader.Loader.collideMaterial; GameMaterial gmt = spheres.Value.spheres[i].material.Value; if (gmt != null && gmt.collideMaterial.Value != null) { gmt.collideMaterial.Value.SetMaterial(mr); } if (collideType != CollideType.None) { Color col = mr.material.color; mr.material = MapLoader.Loader.collideTransparentMaterial; mr.material.color = new Color(col.r, col.g, col.b, col.a * 0.7f); switch (collideType) { case CollideType.ZDD: mr.material.SetTexture("_MainTex", Resources.Load <Texture2D>("Textures/zdd")); break; case CollideType.ZDE: mr.material.SetTexture("_MainTex", Resources.Load <Texture2D>("Textures/zde")); break; case CollideType.ZDM: mr.material.SetTexture("_MainTex", Resources.Load <Texture2D>("Textures/zdm")); break; case CollideType.ZDR: mr.material.SetTexture("_MainTex", Resources.Load <Texture2D>("Textures/zdr")); break; } } } } } return(gao); }
public GameObject GetGameObject(GameObject parent, int index, CollideType collideType = CollideType.None) { GameObject gao = GameObject.CreatePrimitive(PrimitiveType.Sphere); gao.name = "Sphere " + index; gao.transform.SetParent(parent.transform); MeshRenderer mr = gao.GetComponent <MeshRenderer>(); gao.transform.localPosition = new Vector3(x / 256f, z / 256f, y / 256f); gao.transform.localScale = Vector3.one * (radius / 256f) * 2; // default Unity sphere radius is 0.5 gao.layer = LayerMask.NameToLayer("Collide"); BillboardBehaviour bill = gao.AddComponent <BillboardBehaviour>(); bill.mode = BillboardBehaviour.LookAtMode.CameraPosXYZ; GameMaterial gm = (Load as R2PS1Loader).levelHeader.gameMaterials?[gameMaterial]; CollideMaterial cm = gm?.collideMaterial; if (cm != null) { mr.material = cm.CreateMaterial(); } else { mr.material = new Material(MapLoader.Loader.collideMaterial); } if (collideType != CollideType.None) { Color col = mr.material.color; mr.material = new Material(MapLoader.Loader.collideTransparentMaterial); mr.material.color = new Color(col.r, col.g, col.b, col.a * 0.7f); switch (collideType) { case CollideType.ZDD: mr.material.SetTexture("_MainTex", Resources.Load <Texture2D>("Textures/zdd")); break; case CollideType.ZDM: mr.material.SetTexture("_MainTex", Resources.Load <Texture2D>("Textures/zdm")); break; case CollideType.ZDE: mr.material.SetTexture("_MainTex", Resources.Load <Texture2D>("Textures/zde")); break; case CollideType.ZDR: mr.material.SetTexture("_MainTex", Resources.Load <Texture2D>("Textures/zdr")); break; } } CollideComponent cc = gao.AddComponent <CollideComponent>(); cc.collidePS1 = this; cc.type = collideType; return(gao); }
private void CreateUnityMesh() { for (uint i = 0; i < num_spheres; i++) { GameObject sphere_gao = GameObject.CreatePrimitive(PrimitiveType.Sphere); sphere_gao.name = "Collide Spheres @ " + offset + " - " + i + " radius @ " + spheres[i].debug_radiusAddress; sphere_gao.transform.SetParent(gao.transform); MeshFilter mf = sphere_gao.GetComponent <MeshFilter>(); MeshRenderer mr = sphere_gao.GetComponent <MeshRenderer>(); CollideComponent cc = sphere_gao.AddComponent <CollideComponent>(); cc.collide = this; cc.type = geo.type; cc.index = (int)i; //MonoBehaviour.Destroy(sphere_gao.GetComponent<SphereCollider>()); sphere_gao.transform.localPosition = geo.vertices[spheres[i].centerPoint]; sphere_gao.transform.localScale = Vector3.one * spheres[i].radius * 2; // default Unity sphere radius is 0.5 sphere_gao.layer = LayerMask.NameToLayer("Collide"); BillboardBehaviour b = sphere_gao.AddComponent <BillboardBehaviour>(); b.mode = BillboardBehaviour.LookAtMode.CameraPosXYZ; mr.material = MapLoader.Loader.collideMaterial; if (spheres[i].gameMaterial != null && spheres[i].gameMaterial.collideMaterial != null) { spheres[i].gameMaterial.collideMaterial.SetMaterial(mr); } if (geo.type != CollideType.None) { Color col = mr.material.color; mr.material = new Material(MapLoader.Loader.collideTransparentMaterial); mr.material.color = new Color(col.r, col.g, col.b, col.a * 0.7f); switch (geo.type) { case CollideType.ZDD: mr.material.SetTexture("_MainTex", Resources.Load <Texture2D>("Textures/zdd")); break; case CollideType.ZDE: mr.material.SetTexture("_MainTex", Resources.Load <Texture2D>("Textures/zde")); break; case CollideType.ZDM: mr.material.SetTexture("_MainTex", Resources.Load <Texture2D>("Textures/zdm")); break; case CollideType.ZDR: mr.material.SetTexture("_MainTex", Resources.Load <Texture2D>("Textures/zdr")); break; } } } }
public GameObject GetGameObject(out GameObject[] boneGaos, GeometricObject morphObject = null, float morphProgress = 0f) { GameObject parentGao = new GameObject(Offset.ToString()); // Bones boneGaos = null; if (bones != null && bones.Length > 0) { GameObject rootBone = new GameObject("Root bone"); boneGaos = new GameObject[] { rootBone }; boneGaos[0].transform.SetParent(parentGao.transform); boneGaos[0].transform.localPosition = Vector3.zero; boneGaos[0].transform.localRotation = Quaternion.identity; boneGaos[0].transform.localScale = Vector3.one; boneGaos = boneGaos.Concat(bones.Select(b => b.GetGameObject(parentGao))).ToArray(); } // Morph Vector3[] mainVertices = vertices.Select(s => new Vector3( s.x / 256f, s.z / 256f, s.y / 256f)).ToArray(); Color[] mainColors = vertices.Select(s => new Color( s.r / (float)0x80, s.g / (float)0x80, s.b / (float)0x80, 1f)).ToArray(); if (morphProgress > 0f && morphObject != null && morphObject.vertices.Length == vertices.Length) { Vector3[] morphVertices = morphObject.vertices.Select(s => new Vector3( s.x / 256f, s.z / 256f, s.y / 256f)).ToArray(); Color[] morphColors = morphObject.vertices.Select(s => new Color( s.r / (float)0x80, s.g / (float)0x80, s.b / (float)0x80, 1f)).ToArray(); for (int i = 0; i < vertices.Length; i++) { mainVertices[i] = Vector3.Lerp(mainVertices[i], morphVertices[i], morphProgress); mainColors[i] = Color.Lerp(mainColors[i], morphColors[i], morphProgress); } } // First pass Dictionary <VisualMaterial, List <IPS1Polygon> > textured = new Dictionary <VisualMaterial, List <IPS1Polygon> >(); List <IPS1Polygon> untextured = new List <IPS1Polygon>(); for (int i = 0; i < triangleLists.Length; i++) { PolygonList polys = triangleLists[i]; if (polys.polygons != null) { foreach (IPS1Polygon p in polys.polygons) { if (p is QuadLOD && (p as QuadLOD).quads?.Length > 0) { Quad[] quads = (p as QuadLOD).quads; foreach (Quad q in quads) { VisualMaterial b = q.Material; if (b == null) { untextured.Add(q); } else { if (!textured.ContainsKey(b)) { textured[b] = new List <IPS1Polygon>(); } textured[b].Add(q); } } } else { VisualMaterial b = p.Material; if (b == null) { untextured.Add(p); } else { if (!textured.ContainsKey(b)) { textured[b] = new List <IPS1Polygon>(); } textured[b].Add(p); } } } } } // Second pass VisualMaterial[] textures = textured.Keys.ToArray(); for (int i = 0; i < textures.Length; i++) { VisualMaterial vm = textures[i]; TextureBounds b = vm.texture; float alpha = 1f; //if (!vm.IsLight) { /*switch (vm.BlendMode) { * case VisualMaterial.SemiTransparentMode.Point25: * alpha = 0.25f * 4f; * break; * case VisualMaterial.SemiTransparentMode.Point5: * alpha = 0.5f * 4f; * break; * }*/ //} IPS1Polygon pf = textured[vm].FirstOrDefault(); GameObject gao = new GameObject(Offset.ToString() + " - " + i + " - " + pf?.Offset + " - " + pf?.GetType() + " - " + string.Format("{0:X2}", vm.materialFlags) + "|" + string.Format("{0:X2}", vm.scroll) + " - " + vm.BlendMode); gao.transform.SetParent(parentGao.transform); gao.layer = LayerMask.NameToLayer("Visual"); gao.transform.localPosition = Vector3.zero; List <int> vertIndices = new List <int>(); List <int> triIndices = new List <int>(); List <Vector2> uvs = new List <Vector2>(); foreach (IPS1Polygon p in textured[vm]) { int currentCount = vertIndices.Count; switch (p) { case Triangle t: vertIndices.Add(t.v0); vertIndices.Add(t.v1); vertIndices.Add(t.v2); uvs.Add(b.CalculateUV(t.x0, t.y0)); uvs.Add(b.CalculateUV(t.x1, t.y1)); uvs.Add(b.CalculateUV(t.x2, t.y2)); /*Vector2 uv0 = b.CalculateUV(t.x0, t.y0); * Vector2 uv1 = b.CalculateUV(t.x1, t.y1); * Vector2 uv2 = b.CalculateUV(t.x2, t.y2); * uvs.Add(uv0); * uvs.Add(uv1); * uvs.Add(uv2);*/ triIndices.Add(currentCount); triIndices.Add(currentCount + 1); triIndices.Add(currentCount + 2); break; case Quad q: vertIndices.Add(q.v0); vertIndices.Add(q.v1); vertIndices.Add(q.v2); vertIndices.Add(q.v3); uvs.Add(b.CalculateUV(q.x0, q.y0)); uvs.Add(b.CalculateUV(q.x1, q.y1)); uvs.Add(b.CalculateUV(q.x2, q.y2)); uvs.Add(b.CalculateUV(q.x3, q.y3)); triIndices.Add(currentCount); triIndices.Add(currentCount + 1); triIndices.Add(currentCount + 2); triIndices.Add(currentCount + 2); triIndices.Add(currentCount + 1); triIndices.Add(currentCount + 3); break; case Sprite s: GameObject spr_gao = new GameObject("Sprite"); spr_gao.transform.SetParent(gao.transform); spr_gao.transform.localPosition = mainVertices[s.v0]; BillboardBehaviour billboard = spr_gao.AddComponent <BillboardBehaviour>(); billboard.mode = BillboardBehaviour.LookAtMode.ViewRotation; MeshFilter sprites_mf = spr_gao.AddComponent <MeshFilter>(); MeshRenderer sprites_mr = spr_gao.AddComponent <MeshRenderer>(); spr_gao.layer = LayerMask.NameToLayer("Visual"); //Material unityMat = sprites[i].visualMaterial.MaterialBillboard; sprites_mr.receiveShadows = false; sprites_mr.material = vm.CreateMaterial(); var meshUnity = new Mesh(); Vector3[] vertices = new Vector3[4]; float scale_x = 1.0f; float scale_y = 1.0f; scale_x = ((float)s.height / 256f) / 2.0f; scale_y = ((float)s.width / 256f) / 2.0f; BoxCollider bc = spr_gao.AddComponent <BoxCollider>(); bc.size = new Vector3(0, scale_y * 2, scale_x * 2); vertices[0] = new Vector3(0, -scale_y, -scale_x); vertices[1] = new Vector3(0, -scale_y, scale_x); vertices[2] = new Vector3(0, scale_y, -scale_x); vertices[3] = new Vector3(0, scale_y, scale_x); Vector3[] normals = new Vector3[4]; normals[0] = Vector3.forward; normals[1] = Vector3.forward; normals[2] = Vector3.forward; normals[3] = Vector3.forward; Vector3[] sprite_uvs = new Vector3[4]; bool mirrorX = false; bool mirrorY = false; sprite_uvs[0] = new Vector3(0, 0 - (mirrorY ? 1 : 0), alpha); sprite_uvs[1] = new Vector3(1 + (mirrorX ? 1 : 0), 0 - (mirrorY ? 1 : 0), alpha); sprite_uvs[2] = new Vector3(0, 1, alpha); sprite_uvs[3] = new Vector3(1 + (mirrorX ? 1 : 0), 1, alpha); int[] triangles = new int[] { 0, 2, 1, 1, 2, 3 }; meshUnity.vertices = vertices; meshUnity.normals = normals; meshUnity.triangles = triangles; meshUnity.SetUVs(0, sprite_uvs.ToList()); sprites_mf.sharedMesh = meshUnity; break; } } //Vertex[] v = vertIndices.Select(vi => vertices[vi]).ToArray(); BoneWeight[] w = null; if (bones != null && bones.Length > 0 && boneWeights != null) { w = new BoneWeight[vertIndices.Count]; for (int vi = 0; vi < w.Length; vi++) { DeformVertexWeights dvw = boneWeights.FirstOrDefault(bw => bw.ind_vertex == vertIndices[vi]); if (dvw != null) { w[vi] = dvw.UnityWeight; } else { w[vi] = new BoneWeight() { boneIndex0 = 0, weight0 = 1f }; } } } if (vertIndices.Any()) { MeshFilter mf = gao.AddComponent <MeshFilter>(); gao.AddComponent <ExportableModel>(); MeshRenderer mr = null; SkinnedMeshRenderer smr = null; Matrix4x4[] bindPoses = null; if (bones == null || bones.Length <= 0) { mr = gao.AddComponent <MeshRenderer>(); } else { smr = gao.AddComponent <SkinnedMeshRenderer>(); //smr = (SkinnedMeshRenderer)mr; smr.bones = boneGaos.Select(bo => bo.transform).ToArray(); bindPoses = new Matrix4x4[smr.bones.Length]; for (int bi = 0; bi < smr.bones.Length; bi++) { bindPoses[bi] = smr.bones[bi].worldToLocalMatrix * parentGao.transform.localToWorldMatrix; } smr.rootBone = smr.bones[0]; } Mesh m = new Mesh(); m.vertices = vertIndices.Select(vi => mainVertices[vi]).ToArray(); m.colors = vertIndices.Select(vi => mainColors[vi]).ToArray(); m.SetUVs(0, uvs.Select(s => new Vector4(s.x, s.y, alpha, 0f)).ToList()); m.triangles = triIndices.ToArray(); m.RecalculateNormals(); if (w != null) { m.boneWeights = w; m.bindposes = bindPoses; } mf.mesh = m; if (mr != null) { mr.material = vm.CreateMaterial(); } else if (smr != null) { smr.material = vm.CreateMaterial(); smr.sharedMesh = m; } try { MeshCollider mc = gao.AddComponent <MeshCollider>(); mc.isTrigger = false; //mc.cookingOptions = MeshColliderCookingOptions.None; //mc.sharedMesh = mesh; } catch (Exception) { } } } // Untextured (some skyboxes, etc) if (untextured.Count > 0) { GameObject gao = new GameObject(Offset.ToString() + " - Untextured"); gao.transform.SetParent(parentGao.transform); gao.layer = LayerMask.NameToLayer("Visual"); gao.transform.localPosition = Vector3.zero; MeshFilter mf = gao.AddComponent <MeshFilter>(); gao.AddComponent <ExportableModel>(); MeshRenderer mr = gao.AddComponent <MeshRenderer>(); List <int> vertIndices = new List <int>(); List <int> triIndices = new List <int>(); foreach (IPS1Polygon p in untextured) { int currentCount = vertIndices.Count; switch (p) { case TriangleNoTexture t: vertIndices.Add(t.v0); vertIndices.Add(t.v1); vertIndices.Add(t.v2); triIndices.Add(currentCount); triIndices.Add(currentCount + 1); triIndices.Add(currentCount + 2); break; case QuadNoTexture q: vertIndices.Add(q.v0); vertIndices.Add(q.v1); vertIndices.Add(q.v2); vertIndices.Add(q.v3); triIndices.Add(currentCount); triIndices.Add(currentCount + 1); triIndices.Add(currentCount + 2); triIndices.Add(currentCount + 2); triIndices.Add(currentCount + 1); triIndices.Add(currentCount + 3); break; default: Debug.LogWarning(p.GetType()); break; } } //Vertex[] v = vertIndices.Select(vi => vertices[vi]).ToArray(); Mesh m = new Mesh(); m.vertices = vertIndices.Select(vi => mainVertices[vi]).ToArray(); m.colors = vertIndices.Select(vi => mainColors[vi]).ToArray(); m.SetUVs(0, vertIndices.Select(s => new Vector4(0.5f, 0.5f, 1f, 1f)).ToList()); m.triangles = triIndices.ToArray(); m.RecalculateNormals(); mf.mesh = m; Material baseMaterial; /*if (m.colors.Any(c => c.a != 1f)) { * baseMaterial = Load.baseTransparentMaterial; * } else {*/ baseMaterial = Load.baseMaterial; //} Material mat = new Material(baseMaterial); mat.SetInt("_NumTextures", 1); string textureName = "_Tex0"; Texture2D tex = Util.GrayTexture(); mat.SetTexture(textureName, tex); mat.SetVector("_AmbientCoef", Vector4.one); mat.SetFloat("_Prelit", 1f); mr.material = mat; try { MeshCollider mc = gao.AddComponent <MeshCollider>(); mc.isTrigger = false; //mc.cookingOptions = MeshColliderCookingOptions.None; //mc.sharedMesh = mesh; } catch (Exception) { } } return(parentGao); }
public GameObject GetGameObject(Type type, CollideType collideType = CollideType.None) { GameObject gao = new GameObject("GeometricObject @ " + Offset); if (type == Type.Visual) { gao.layer = LayerMask.NameToLayer("Visual"); } else { gao.layer = LayerMask.NameToLayer("Collide"); } gao.name = gao.name + " - S0:" + scaleFactor + " - S1:" + factor_1 + " - U0:" + string.Format("{0:X4}", unk0) + " - U1:" + string.Format("{0:X4}", unk1) + " - U2:" + string.Format("{0:X4}", hasVertexColors) + " - U3:" + string.Format("{0:X4}", lookAtMode); MapLoader l = MapLoader.Loader; if (type == Type.Visual) { if (elementsVisual.Value != null) { // First, reset vertex buffer if (Settings.s.platform == Settings.Platform.N64) { foreach (GeometricObjectElementVisualList.GeometricElementListEntry entry in elementsVisual.Value.elements) { if (entry.element.Value is GeometricObjectElementTriangles) { GeometricObjectElementTriangles el = entry.element.Value as GeometricObjectElementTriangles; el.ResetVertexBuffer(); } } } //gao.transform.position = new Vector3(UnityEngine.Random.Range(-100f, 100f), UnityEngine.Random.Range(-100f, 100f), UnityEngine.Random.Range(-100f, 100f)); foreach (GeometricObjectElementVisualList.GeometricElementListEntry entry in elementsVisual.Value.elements) { /*if (entry.element.Value == null) { * l.print("Visual element null: " + entry.element.type); * }*/ if (entry.element.Value != null) { GameObject child = null; if (entry.element.Value is GeometricObjectElementTriangles) { GeometricObjectElementTriangles el = entry.element.Value as GeometricObjectElementTriangles; child = el.GetGameObject(type, this); } else if (entry.element.Value is GeometricObjectElementSprites) { GeometricObjectElementSprites el = entry.element.Value as GeometricObjectElementSprites; child = el.GetGameObject(type, this); } if (child != null) { child.transform.SetParent(gao.transform); child.transform.localPosition = Vector3.zero; } } } } if (lookAtMode != 0) { BillboardBehaviour billboard = gao.AddComponent <BillboardBehaviour>(); billboard.mode = (BillboardBehaviour.LookAtMode)lookAtMode; } } else { if (elementsCollide.Value != null) { foreach (GeometricObjectElementCollideList.GeometricElementListEntry entry in elementsCollide.Value.elements) { if (entry.element.Value == null) { l.print("Collide element null: " + entry.element.type); } if (entry.element.Value != null) { GameObject child = null; if (entry.element.Value is GeometricObjectElementCollideTriangles) { GeometricObjectElementCollideTriangles el = entry.element.Value as GeometricObjectElementCollideTriangles; child = el.GetGameObject(type, this, collideType: collideType); } else if (entry.element.Value is GeometricObjectElementCollideSpheres) { GeometricObjectElementCollideSpheres el = entry.element.Value as GeometricObjectElementCollideSpheres; child = el.GetGameObject(type, this, collideType: collideType); } else if (entry.element.Value is GeometricObjectElementCollideAlignedBoxes) { GeometricObjectElementCollideAlignedBoxes el = entry.element.Value as GeometricObjectElementCollideAlignedBoxes; child = el.GetGameObject(type, this, collideType: collideType); } if (child != null) { child.transform.SetParent(gao.transform); child.transform.localPosition = Vector3.zero; } } } } } return(gao); }
public GameObject GetGameObject(GeometricObject.Type type, GeometricObject go) { if (type == GeometricObject.Type.Visual) { float curScaleX = scaleX / 2f; float curScaleY = scaleY / 2f; GameObject gao = new GameObject("ElementSprites @ " + Offset); gao.layer = LayerMask.NameToLayer("Visual"); gao.transform.localPosition = Vector3.zero; GameObject spr_gao = new GameObject("Sprite 0"); spr_gao.transform.SetParent(gao.transform); spr_gao.transform.localPosition = go.verticesCollide.Value.vectors[vertexIndex].GetVector(go.ScaleFactor); BillboardBehaviour billboard = spr_gao.AddComponent <BillboardBehaviour>(); billboard.mode = BillboardBehaviour.LookAtMode.ViewRotation; MeshFilter mf = spr_gao.AddComponent <MeshFilter>(); MeshRenderer mr = spr_gao.AddComponent <MeshRenderer>(); BoxCollider bc = spr_gao.AddComponent <BoxCollider>(); bc.size = new Vector3(0, curScaleY * 2, curScaleX * 2); spr_gao.layer = LayerMask.NameToLayer("Visual"); mr.material = visualMaterial.Value.GetMaterial(VisualMaterial.Hint.Billboard, gao: spr_gao); bool mirrorX = false; bool mirrorY = false; if (visualMaterial.Value.num_textures > 0 && visualMaterial.Value.textures.Value.vmTex[0].texRef.Value != null && visualMaterial.Value.textures.Value.vmTex[0].texRef.Value.texInfo.Value != null) { TextureInfo ti = visualMaterial.Value.textures.Value.vmTex[0].texRef.Value.texInfo.Value; if (ti.IsMirrorX) { mirrorX = true; } if (ti.IsMirrorY) { mirrorY = true; } /*spr_gao.name += " " + string.Format("0x{0:X4}", visualMaterial.Value.num_textures) + " " + string.Format("0x{0:X4}", visualMaterial.Value.num_animTextures); * for (int i = 0; i < visualMaterial.Value.num_textures; i++) { * spr_gao.name += " " + visualMaterial.Value.textures.Value.vmTex[i].time; * }*/ } /*if (visualMaterial.Value.num_textures > 1) { * MultiTextureMaterial mtmat = mr.gameObject.AddComponent<MultiTextureMaterial>(); * mtmat.visMat = sprites[i].visualMaterial; * mtmat.mat = mr.sharedMaterial; * }*/ Mesh meshUnity = new Mesh(); Vector3[] vertices = new Vector3[4]; vertices[0] = new Vector3(0, -curScaleY, -curScaleX); vertices[1] = new Vector3(0, -curScaleY, curScaleX); vertices[2] = new Vector3(0, curScaleY, -curScaleX); vertices[3] = new Vector3(0, curScaleY, curScaleX); Vector3[] normals = new Vector3[4]; normals[0] = Vector3.forward; normals[1] = Vector3.forward; normals[2] = Vector3.forward; normals[3] = Vector3.forward; Vector3[] uvs = new Vector3[4]; if (Settings.s.platform == Settings.Platform.N64) { uvs[0] = new Vector3(0, -(mirrorY ? 1 : 0), 1); uvs[1] = new Vector3(1 + (mirrorX ? 1 : 0), -(mirrorY ? 1 : 0), 1); uvs[2] = new Vector3(0, 1, 1); uvs[3] = new Vector3(1 + (mirrorX ? 1 : 0), 1, 1); } else { uvs[0] = new Vector3(0, 1 + (mirrorY ? 1 : 0), 1); uvs[1] = new Vector3(1 + (mirrorX ? 1 : 0), 1 + (mirrorY ? 1 : 0), 1); uvs[2] = new Vector3(0, 0, 1); uvs[3] = new Vector3(1 + (mirrorX ? 1 : 0), 0, 1); } int[] triangles = new int[] { 0, 2, 1, 1, 2, 3 }; meshUnity.vertices = vertices; meshUnity.normals = normals; meshUnity.triangles = triangles; meshUnity.SetUVs(0, uvs.ToList()); mf.sharedMesh = meshUnity; return(gao); } else { return(null); } }
private void CreateUnityMesh() { for (uint i = 0; i < num_sprites; i++) { bool mirrorX = false; bool mirrorY = false; GameObject spr_gao = new GameObject(name + " - Sprite " + i); spr_gao.transform.SetParent(gao.transform); spr_gao.transform.localPosition = geo.vertices[sprites[i].centerPoint]; BillboardBehaviour billboard = spr_gao.AddComponent <BillboardBehaviour>(); billboard.mode = BillboardBehaviour.LookAtMode.ViewRotation; MeshFilter mf = spr_gao.AddComponent <MeshFilter>(); MeshRenderer mr = spr_gao.AddComponent <MeshRenderer>(); BoxCollider bc = spr_gao.AddComponent <BoxCollider>(); bc.size = new Vector3(0, sprites[i].info_scale.y * 2, sprites[i].info_scale.x * 2); spr_gao.layer = LayerMask.NameToLayer("Visual"); if (sprites[i].visualMaterial != null) { if (Settings.s.game != Settings.Game.R2Revolution && sprites[i].visualMaterial.textures != null && sprites[i].visualMaterial.textures.Count > 0) { TextureInfo mainTex = sprites[i].visualMaterial.textures[0].texture; if (mainTex != null && mainTex.IsMirrorX) { mirrorX = true; } if (mainTex != null && mainTex.IsMirrorY) { mirrorY = true; } } //Material unityMat = sprites[i].visualMaterial.MaterialBillboard; Material unityMat = sprites[i].visualMaterial.GetMaterial(VisualMaterial.Hint.Billboard); bool receiveShadows = (sprites[i].visualMaterial.properties & VisualMaterial.property_receiveShadows) != 0; //if (num_uvMaps > 1) unityMat.SetFloat("_UVSec", 50f); //if (r3mat.Material.GetColor("_EmissionColor") != Color.black) print("Mesh with emission: " + name); mr.sharedMaterial = unityMat; /*mr.material.SetFloat("_ScaleX", sprites[i].info_scale.x); * mr.material.SetFloat("_ScaleY", sprites[i].info_scale.y);*/ if (!receiveShadows) { mr.receiveShadows = false; } if (sprites[i].visualMaterial.animTextures.Count > 0) { MultiTextureMaterial mtmat = mr.gameObject.AddComponent <MultiTextureMaterial>(); mtmat.visMat = sprites[i].visualMaterial; mtmat.mat = mr.material; } } else { Material transMat = new Material(MapLoader.Loader.baseTransparentMaterial); Texture2D tex = new Texture2D(1, 1); tex.SetPixel(0, 0, new Color(0, 0, 0, 0)); transMat.SetTexture("_Tex0", tex); mr.sharedMaterial = transMat; } if (sprites[i].meshUnity == null) { sprites[i].meshUnity = new Mesh(); Vector3[] vertices = new Vector3[4]; vertices[0] = new Vector3(0, -sprites[i].info_scale.y, -sprites[i].info_scale.x); vertices[1] = new Vector3(0, -sprites[i].info_scale.y, sprites[i].info_scale.x); vertices[2] = new Vector3(0, sprites[i].info_scale.y, -sprites[i].info_scale.x); vertices[3] = new Vector3(0, sprites[i].info_scale.y, sprites[i].info_scale.x); Vector3[] normals = new Vector3[4]; normals[0] = Vector3.forward; normals[1] = Vector3.forward; normals[2] = Vector3.forward; normals[3] = Vector3.forward; Vector3[] uvs = new Vector3[4]; uvs[0] = new Vector3(0, 0 - (mirrorY ? 1 : 0), 1); uvs[1] = new Vector3(1 + (mirrorX ? 1 : 0), 0 - (mirrorY ? 1 : 0), 1); uvs[2] = new Vector3(0, 1, 1); uvs[3] = new Vector3(1 + (mirrorX ? 1 : 0), 1, 1); int[] triangles = new int[] { 0, 2, 1, 1, 2, 3 }; sprites[i].meshUnity.vertices = vertices; sprites[i].meshUnity.normals = normals; sprites[i].meshUnity.triangles = triangles; sprites[i].meshUnity.SetUVs(0, uvs.ToList()); } mf.sharedMesh = sprites[i].meshUnity; } }