GameObject InstantiateSiPrimitive(SiPrimitive primitive, bool visual, bool collidable) { Assert(visual || collidable); var width = Math.Max(primitive.Width, 1F); var height = Math.Max(primitive.Height, 0.01F); var obj = GameObject.CreatePrimitive(primitive.Type); obj.name = primitive.Name; obj.transform.position = new Vector3(0, height / 2, 0); obj.transform.localScale = primitive.Scale * new Vector3(width, height, 1); // obj.transform.Rotate(0.5F, 0, 0); if (visual) { var materialProps = SiAVObjectPropertiesToMaterialProperties(primitive); var meshRenderer = obj.GetComponent <MeshRenderer>(); meshRenderer.material = _materialManager.BuildMaterialFromProperties(materialProps); if (Utils.ContainsBitFlags(primitive.Flags, (int)SiAVObject.SiFlags.Hidden)) { meshRenderer.enabled = false; } obj.isStatic = true; } if (collidable) { if (KinematicRigidbodies) { obj.AddComponent <Rigidbody>().isKinematic = true; } } //ApplySiAVObject(primitive, obj); return(obj); }
GameObject InstantiateNiTriShape(NiTriShape triShape, bool visual, bool collidable) { Assert(visual || collidable); var mesh = NiTriShapeDataToMesh((NiTriShapeData)_obj.Blocks[triShape.Data.Value]); var obj = new GameObject(triShape.Name); if (visual) { obj.AddComponent <MeshFilter>().mesh = mesh; var materialProps = NiAVObjectPropertiesToMaterialProperties(triShape); var meshRenderer = obj.AddComponent <MeshRenderer>(); meshRenderer.material = _materialManager.BuildMaterialFromProperties(materialProps); if (Utils.ContainsBitFlags(triShape.Flags, (int)NiAVObject.NiFlags.Hidden)) { meshRenderer.enabled = false; } obj.isStatic = true; } if (collidable) { obj.AddComponent <MeshCollider>().sharedMesh = mesh; if (KinematicRigidbodies) { obj.AddComponent <Rigidbody>().isKinematic = true; } } ApplyNiAVObject(triShape, obj); return(obj); }
static void MakeTexture(string path) { var textureManager = new TextureManager(Asset); var materialManager = new MaterialManager(textureManager); var obj = GameObject.Find("Cube"); // CreatePrimitive(PrimitiveType.Cube); var meshRenderer = obj.GetComponent <MeshRenderer>(); var materialProps = new MaterialProps { Textures = new MaterialTextures { MainFilePath = path }, }; meshRenderer.material = materialManager.BuildMaterialFromProperties(materialProps); }
static GameObject MakeTexture(string path, int idx) { var textureManager = new TextureManager(AssetPack); var materialManager = new MaterialManager(textureManager); var obj = GameObject.CreatePrimitive(PrimitiveType.Plane); obj.name = path.Replace("/", ""); obj.transform.localPosition += new Vector3(10 * (idx % 10), 0, 10 * (idx / 10)); var meshRenderer = obj.GetComponent <MeshRenderer>(); var materialProps = new MaterialProps { Textures = new MaterialTextures { MainFilePath = path }, }; meshRenderer.material = materialManager.BuildMaterialFromProperties(materialProps); return(obj); }
GameObject InstantiateNiTriShape(SiMesh data, bool visual, bool collidable) { Assert(visual || collidable); var mesh = MeshLodDataToMesh(data.Lod); var obj = new GameObject(); if (visual) { obj.AddComponent <MeshFilter>().mesh = mesh; var materialProps = MeshLodDataToMaterialProperties(data.Lod); var meshRenderer = obj.AddComponent <MeshRenderer>(); meshRenderer.material = _materialManager.BuildMaterialFromProperties(materialProps); obj.isStatic = true; } if (collidable) { obj.AddComponent <MeshCollider>().sharedMesh = mesh; if (KinematicRigidbodies) { obj.AddComponent <Rigidbody>().isKinematic = true; } } return(obj); }
IEnumerable <GameObject> InstantiateNodeMesh(ChunkNode chunkNode, ChunkMesh meshData, bool visual, bool collidable) { if (meshData.MeshSubsets == 0) // This is probably wrong. These may be parents with no geometry, but still have an offset { Log($"*******Found a Mesh chunk with no Submesh ID (ID: {meshData.ID:X}, Name: {chunkNode.Name}). Skipping..."); // data.WriteChunk(); // Log($"Node Chunk: {chunkNode.Name}"); // transform = cgfData.GetTransform(chunkNode, transform); yield break; } if (meshData.VerticesData == 0 && meshData.VertsUVsData == 0) // This is probably wrong. These may be parents with no geometry, but still have an offset { Log($"*******Found a Mesh chunk with no Vertex info (ID: {meshData.ID:X}, Name: {chunkNode.Name}). Skipping..."); //data.WriteChunk(); //Log($"Node Chunk: {chunkNode.Name}"); //transform = cgfData.GetTransform(chunkNode, transform); yield break; } // Going to assume that there is only one VerticesData datastream for now. Need to watch for this. // Some 801 types have vertices and not VertsUVs. var chunkMap = chunkNode._model.ChunkMap; var tmpMtlName = chunkMap.GetValue(chunkNode.MatID, null) as ChunkMtlName; var tmpMeshSubsets = chunkMap.GetValue(meshData.MeshSubsets, null) as ChunkMeshSubsets; // Listed as Object ID for the Node var tmpIndices = chunkMap.GetValue(meshData.IndicesData, null) as ChunkDataStream; var tmpVertices = chunkMap.GetValue(meshData.VerticesData, null) as ChunkDataStream; var tmpNormals = chunkMap.GetValue(meshData.NormalsData, null) as ChunkDataStream; var tmpUVs = chunkMap.GetValue(meshData.UVsData, null) as ChunkDataStream; var tmpVertsUVs = chunkMap.GetValue(meshData.VertsUVsData, null) as ChunkDataStream; foreach (var meshSubset in tmpMeshSubsets.MeshSubsets) { var mesh = DataToMesh(chunkNode, meshData, tmpIndices, tmpVertices, tmpNormals, tmpUVs, tmpVertsUVs, meshSubset); var obj = new GameObject(chunkNode.Name); if (visual) { obj.AddComponent <MeshFilter>().mesh = mesh; // MATERIAL MaterialProps materialProps; if (_file.Materials.Length > meshSubset.MatID) { materialProps = MeshPropertiesToMaterialProperties(_file.Materials[meshSubset.MatID]); } else { if (_file.Materials.Length > 0) { Log($"Missing Material {meshSubset.MatID}"); } // The material file doesn't have any elements with the Name of the material. Use the object name. var mtl = _file.Materials.First(x => x.Name == $"{_file.RootNode.Name}_{meshSubset.MatID}"); materialProps = MeshPropertiesToMaterialProperties(mtl); } var meshRenderer = obj.AddComponent <MeshRenderer>(); meshRenderer.material = _materialManager.BuildMaterialFromProperties(materialProps); //if (Utils.ContainsBitFlags(triShape.Flags, (int)NiAVObject.NiFlags.Hidden)) // meshRenderer.enabled = false; obj.isStatic = true; } if (collidable) { obj.AddComponent <MeshCollider>().sharedMesh = mesh; if (KinematicRigidbodies) { obj.AddComponent <Rigidbody>().isKinematic = true; } } yield return(obj); } }