protected override Stream UnParse() { if (version == 0 && publicChunks == 0 && unused == 0 && blockList == null && resources == null) { // In that case, assume we're a newly created "stream == null" situation GenericRCOLResource that needs // some help to become a real life GeometryResource. resources = new CountedTGIBlockList(OnResourceChanged, "ITG"); // Unfortunately, a Resource does not know its own ResourceKey. This is the best we can manage. TGIBlock rk = new TGIBlock(0, null, 0x015A1849, 0, 0); GEOM geom = new GEOM(requestedApiVersion, OnResourceChanged); blockList = new ChunkEntryList(OnResourceChanged, new ChunkEntry[] { new ChunkEntry(0, OnResourceChanged, rk, geom), }) { ParentTGIBlocks = Resources, }; } return base.UnParse(); }
public GeometryResource(int APIversion, Stream s) : base(APIversion, s) { if (ChunkEntries.Count != 1) throw new InvalidDataException(String.Format("Expected one chunk, found {0}.", ChunkEntries.Count)); var chunk = ChunkEntries[0]; ChunkEntries.Remove(chunk); using (MemoryStream ms = new MemoryStream()) { new BinaryWriter(ms).Write(chunk.RCOLBlock.AsBytes); ms.Flush(); ms.Position = 0; GEOM geom = new GEOM(requestedApiVersion, OnResourceChanged, ms); ChunkEntries.Add(new ChunkEntry(0, OnResourceChanged, chunk.TGIBlock, geom)); } }
public OBJ(GEOM geom, List <GEOM.Face[]> layers, List <string> layerNames, int uvSet) { vertexList = new List <Vertex>(); normalList = new List <Normal>(); uvList = new List <UV>(); groupList = new List <Group>(); int vertOffset = 1; int groupNum = 0; if (!geom.hasUVset(uvSet)) { DialogResult res = MessageBox.Show("Input GEOM does not have UV set " + uvSet.ToString() + "! Continue using UV0?", "No UV" + uvSet.ToString(), MessageBoxButtons.OKCancel); if (res == DialogResult.Cancel) { return; } } for (int i = 0; i < geom.numberVertices; i++) { vertexList.Add(new Vertex(geom.getPosition(i))); normalList.Add(new Normal(geom.getNormal(i))); uvList.Add(new UV(geom.getUV(i, uvSet), true)); } for (int l = 0; l < layers.Count; l++) { string grpName; if (layerNames != null) { grpName = layerNames[l] + l.ToString(); } else { grpName = "Layer" + l.ToString(); } this.groupList.Add(new Group(grpName)); for (int i = 0; i < layers[l].Length; i++) { this.groupList[groupNum].addFace(new Face(new int[] { layers[l][i].facePoint0, layers[l][i].facePoint1, layers[l][i].facePoint2 }, vertOffset)); } groupNum++; } }
protected override Stream UnParse() { if (version == 0 && publicChunks == 0 && unused == 0 && blockList == null && resources == null) { // In that case, assume we're a newly created "stream == null" situation GenericRCOLResource that needs // some help to become a real life GeometryResource. resources = new CountedTGIBlockList(OnResourceChanged, "ITG"); // Unfortunately, a Resource does not know its own ResourceKey. This is the best we can manage. TGIBlock rk = new TGIBlock(null, 0x015A1849, 0, 0); GEOM geom = new GEOM(OnResourceChanged); blockList = new ChunkEntryList(OnResourceChanged, new[] { new ChunkEntry(OnResourceChanged, rk, geom), }) { ParentTGIBlocks = Resources, }; } return(base.UnParse()); }
public GeometryResource(Stream s) : base(s) { if (ChunkEntries.Count != 1) { throw new InvalidDataException(String.Format("Expected one chunk, found {0}.", ChunkEntries.Count)); } ChunkEntry chunk = ChunkEntries[0]; ChunkEntries.Remove(chunk); using (MemoryStream ms = new MemoryStream()) { new BinaryWriter(ms).Write(chunk.RCOLBlock.AsBytes); ms.Flush(); ms.Position = 0; GEOM geom = new GEOM(OnResourceChanged, ms); ChunkEntries.Add(new ChunkEntry(OnResourceChanged, chunk.TGIBlock, geom)); } }
internal CTMESH(GEOM geom) { if (geom.numberVertices > MAX_VERTICES) { throw new MeshException("This mesh has too many vertices and cannot be converted to a CAS Tools Mesh!"); } if (geom.numberFaces > MAX_TRIANGLES) { throw new MeshException("This mesh has too many triangles and cannot be converted to a CAS Tools Mesh!"); } this.vertices = new Vector3[geom.numberVertices]; for (int i = 0; i < geom.numberVertices; i++) { this.vertices[i] = new Vector3(geom.getPosition(i)); } faces = new Face[geom.numberFaces]; for (int i = 0; i < geom.numberFaces; i++) { int[] f = geom.getFaceIndices(i); //vertex indices FacePoint[] points = new FacePoint[3]; for (int p = 0; p < 3; p++) //for each vertex in the face { Vector3 pos = new Vector3(geom.getPosition(f[p])); Vector3 norm = new Vector3(geom.getNormal(f[p])); Vector2[] uv = new Vector2[geom.numberUVsets]; for (int u = 0; u < geom.numberUVsets; u++) { uv[u] = new Vector2(geom.getUV(f[p], u)); } points[p] = new FacePoint(f[p], pos, norm, uv); } faces[i] = new Face(f, points); } }
private void InitScene() { GeostatesPanel.Visibility = Visibility.Collapsed; GenericRCOLResource.ChunkEntry chunk = rcol.ChunkEntries.FirstOrDefault(x => x.RCOLBlock is MLOD); int polyCount = 0; int vertCount = 0; if (chunk != null) { var mlod = chunk.RCOLBlock as MLOD; foreach (MLOD.Mesh m in mlod.Meshes) { try { vertCount += m.VertexCount; polyCount += m.PrimitiveCount; var vbuf = (VBUF)GenericRCOLResource.ChunkReference.GetBlock(rcol, m.VertexBufferIndex); var ibuf = (IBUF)GenericRCOLResource.ChunkReference.GetBlock(rcol, m.IndexBufferIndex); VRTF vrtf = (VRTF)GenericRCOLResource.ChunkReference.GetBlock(rcol, m.VertexFormatIndex) ?? VRTF.CreateDefaultForMesh(m); IRCOLBlock material = GenericRCOLResource.ChunkReference.GetBlock(rcol, m.MaterialIndex); MATD matd = FindMainMATD(rcol, material); float[] uvscale = GetUvScales(matd); if (uvscale != null) { Debug.WriteLine(string.Format("{0} - {1} - {2}", uvscale[0], uvscale[2], uvscale[2])); } else { Debug.WriteLine("No scales"); } GeometryModel3D model = DrawModel(vbuf.GetVertices(m, vrtf, uvscale), ibuf.GetIndices(m), mNonSelectedMaterial); var sceneMesh = new SceneMlodMesh(m, model); if (matd != null) { sceneMesh.Shader = matd.Shader; switch (matd.Shader) { case ShaderType.ShadowMap: case ShaderType.DropShadow: break; default: var maskWidth = GetMATDParam <ElementInt>(matd, FieldType.MaskWidth); var maskHeight = GetMATDParam <ElementInt>(matd, FieldType.MaskHeight); if (maskWidth != null && maskHeight != null) { float scalar = Math.Max(maskWidth.Data, maskHeight.Data); mCheckerBrush.Transform = new ScaleTransform(maskHeight.Data / scalar, maskWidth.Data / scalar); } break; } } try { var sceneGeostates = new SceneGeostate[m.GeometryStates.Count]; for (int i = 0; i < sceneGeostates.Length; i++) { GeometryModel3D state = DrawModel(vbuf.GetVertices(m, vrtf, m.GeometryStates[i], uvscale), ibuf.GetIndices(m, m.GeometryStates[i]), mHiddenMaterial); mGroupMeshes.Children.Add(state); sceneGeostates[i] = new SceneGeostate(sceneMesh, m.GeometryStates[i], state); } sceneMesh.States = sceneGeostates; } catch (Exception ex) { MessageBox.Show("Unable to load Geostates. You may have some corrupted data: " + ex.ToString(), "Unable to load Geostates..."); } mGroupMeshes.Children.Add(model); mSceneMeshes.Add(sceneMesh); } catch (Exception ex) { MessageBox.Show(String.Format("Unable to load mesh id 0x{0:X8}", m.Name)); } } } else { GenericRCOLResource.ChunkEntry geomChunk = rcol.ChunkEntries.FirstOrDefault(); var geom = new GEOM(0, null, geomChunk.RCOLBlock.Stream); var verts = new List <Vertex>(); polyCount = geom.Faces.Count; vertCount = geom.VertexData.Count; foreach (GEOM.VertexDataElement vd in geom.VertexData) { var v = new Vertex(); var pos = (GEOM.PositionElement)vd.Vertex.FirstOrDefault(e => e is GEOM.PositionElement); if (pos != null) { v.Position = new[] { pos.X, pos.Y, pos.Z }; } var norm = (GEOM.NormalElement)vd.Vertex.FirstOrDefault(e => e is GEOM.NormalElement); if (norm != null) { v.Normal = new[] { norm.X, norm.Y, norm.Z }; } var uv = (GEOM.UVElement)vd.Vertex.FirstOrDefault(e => e is GEOM.UVElement); if (uv != null) { v.UV = new[] { new[] { uv.U, uv.V } }; } verts.Add(v); } var facepoints = new List <int>(); foreach (GEOM.Face face in geom.Faces) { facepoints.Add(face.VertexDataIndex0); facepoints.Add(face.VertexDataIndex1); facepoints.Add(face.VertexDataIndex2); } GeometryModel3D model = DrawModel(verts.ToArray(), facepoints.ToArray(), mNonSelectedMaterial); var sceneMesh = new SceneGeomMesh(geom, model); mGroupMeshes.Children.Add(model); mSceneMeshes.Add(sceneMesh); } foreach (SceneMesh s in mSceneMeshes) { mMeshListView.Items.Add(s); } if (mSceneMeshes.Count <= 1) { MeshesPanel.Visibility = Visibility.Collapsed; } VertexCount.Text = String.Format("Vertices: {0}", vertCount); PolygonCount.Text = String.Format("Polygons: {0}", polyCount); }
public SceneGeomMesh(GEOM mesh, GeometryModel3D model) : base(model) { Mesh = mesh; }