Exemplo n.º 1
0
        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();
        }
Exemplo n.º 2
0
        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));
            }
        }
Exemplo n.º 3
0
        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++;
            }
        }
Exemplo n.º 4
0
        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());
        }
Exemplo n.º 5
0
        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));
            }
        }
Exemplo n.º 6
0
        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);
            }
        }
Exemplo n.º 7
0
        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);
        }
Exemplo n.º 8
0
 public SceneGeomMesh(GEOM mesh, GeometryModel3D model)
     : base(model)
 {
     Mesh = mesh;
 }