public OViewportPanel()
        {
            initialRotation = new RenderBase.OVector2();
            initialMovement = new RenderBase.OVector2();
            finalMovement = new RenderBase.OVector2();

            InitializeComponent();
        }
        public OViewportPanel()
        {
            initialRotation = new RenderBase.OVector2();
            initialMovement = new RenderBase.OVector2();
            finalMovement   = new RenderBase.OVector2();

            InitializeComponent();
        }
Пример #3
0
 private void Screen_MouseDown(object sender, MouseEventArgs e)
 {
     if (!Screen.Focused) Screen.Select();
     clicked = true;
     switch (e.Button)
     {
         case MouseButtons.Left: initialRotation = new RenderBase.OVector2(e.X, e.Y); break;
         case MouseButtons.Right: initialMovement = new RenderBase.OVector2(MousePosition.X, MousePosition.Y); break;
     }
 }
 private void Screen_MouseUp(object sender, MouseEventArgs e)
 {
     if (clicked)
     {
         clicked = false;
         float x = finalMovement.x + (initialMovement.x - e.X);
         float y = finalMovement.y + (initialMovement.y - e.Y);
         if (e.Button == MouseButtons.Right)
         {
             finalMovement = new RenderBase.OVector2(x, y);
         }
     }
 }
        private void Screen_MouseDown(object sender, MouseEventArgs e)
        {
            if (!Screen.Focused)
            {
                Screen.Select();
            }
            clicked = true;
            switch (e.Button)
            {
            case MouseButtons.Left: initialRotation = new RenderBase.OVector2(e.X, e.Y); break;

            case MouseButtons.Right: initialMovement = new RenderBase.OVector2(e.X, e.Y); break;
            }
        }
 private void Screen_MouseMove(object sender, MouseEventArgs e)
 {
     if (clicked)
     {
         if (renderer != null)
         {
             switch (e.Button)
             {
                 case MouseButtons.Left:
                     float rY = (float)(((e.X - initialRotation.x) / Screen.Width) * Math.PI);
                     float rX = (float)(((e.Y - initialRotation.y) / Screen.Height) * Math.PI);
                     renderer.setRotation(rY, rX);
                     initialRotation = new RenderBase.OVector2(e.X, e.Y);
                     break;
                 case MouseButtons.Right:
                     float tX = (initialMovement.x - e.X) + finalMovement.x;
                     float tY = (initialMovement.y - e.Y) + finalMovement.y;
                     renderer.setTranslation(tX, tY);
                     break;
             }
         }
     }
 }
        private void Screen_MouseMove(object sender, MouseEventArgs e)
        {
            if (clicked)
            {
                if (renderer != null)
                {
                    switch (e.Button)
                    {
                    case MouseButtons.Left:
                        float rY = (float)(((e.X - initialRotation.x) / Screen.Width) * Math.PI);
                        float rX = (float)(((e.Y - initialRotation.y) / Screen.Height) * Math.PI);
                        renderer.setRotation(rY, rX);
                        initialRotation = new RenderBase.OVector2(e.X, e.Y);
                        break;

                    case MouseButtons.Right:
                        float tX = (initialMovement.x - e.X) + finalMovement.x;
                        float tY = (initialMovement.y - e.Y) + finalMovement.y;
                        renderer.setTranslation(tX, tY);
                        break;
                    }
                }
            }
        }
Пример #8
0
        /// <summary>
        ///     Imports a Wavefront OBJ model from file.
        /// </summary>
        /// <param name="fileName">The complete file name</param>
        /// <returns></returns>
        public RenderBase.OModelGroup import(string fileName)
        {
            RenderBase.OModelGroup output = new RenderBase.OModelGroup();
            RenderBase.OModel      model  = new RenderBase.OModel();

            string obj = File.ReadAllText(fileName);

            List <RenderBase.OVector3> vertices     = new List <RenderBase.OVector3>();
            List <RenderBase.OVector3> normals      = new List <RenderBase.OVector3>();
            List <RenderBase.OVector2> uvs          = new List <RenderBase.OVector2>();
            List <RenderBase.OVertex>  currVertices = new List <RenderBase.OVertex>();

            string name = string.Empty, oldName;

            string[] lines = obj.Split((char)0xa);
            foreach (string l in lines)
            {
                string   line       = l.Trim();
                string[] lineParams = Regex.Split(line, "\\s+");

                switch (lineParams[0])
                {
                case "v":
                case "vn":
                    RenderBase.OVector3 pvec = new RenderBase.OVector3();
                    pvec.x = float.Parse(lineParams[1], CultureInfo.InvariantCulture);
                    pvec.y = float.Parse(lineParams[2], CultureInfo.InvariantCulture);
                    pvec.z = float.Parse(lineParams[3], CultureInfo.InvariantCulture);
                    if (lineParams[0] == "v")
                    {
                        vertices.Add(pvec);
                    }
                    else
                    {
                        normals.Add(pvec);
                    }
                    break;

                case "vt":
                    RenderBase.OVector2 tvec = new RenderBase.OVector2();
                    tvec.x = float.Parse(lineParams[1], CultureInfo.InvariantCulture);
                    tvec.y = float.Parse(lineParams[2], CultureInfo.InvariantCulture);
                    uvs.Add(tvec);
                    break;

                case "f":
                    string[][] vtx = new string[lineParams.Length - 1][];
                    for (int i = 0; i < lineParams.Length - 1; i++)
                    {
                        vtx[i] = lineParams[i + 1].Split('/');
                    }

                    for (int i = 0; i < lineParams.Length - 1; i++)
                    {
                        RenderBase.OVertex vertex = new RenderBase.OVertex();

                        vertex.position = vertices[int.Parse(vtx[i][0]) - 1];
                        if (vtx[i].Length > 1 && vtx[i][1] != string.Empty)
                        {
                            vertex.texture0 = uvs[int.Parse(vtx[i][1]) - 1];
                        }
                        if (vtx[i].Length > 2)
                        {
                            vertex.normal = normals[int.Parse(vtx[i][2]) - 1];
                        }
                        vertex.diffuseColor = 0xffffffff;

                        if (i > 2)
                        {
                            currVertices.Add(currVertices[currVertices.Count - 3]);
                            currVertices.Add(currVertices[currVertices.Count - 2]);
                            currVertices.Add(vertex);
                        }
                        else
                        {
                            currVertices.Add(vertex);
                        }
                    }
                    break;

                case "g":
                    oldName = name;
                    if (lineParams.Length > 1)
                    {
                        name = lineParams[1];
                    }
                    else
                    {
                        name = "mesh";
                    }

                    if (currVertices.Count > 0)
                    {
                        RenderBase.OMesh mesh = new RenderBase.OMesh();
                        mesh.vertices   = currVertices;
                        mesh.name       = oldName;
                        mesh.hasNormal  = true;
                        mesh.texUVCount = 1;
                        model.mesh.Add(mesh);

                        currVertices = new List <RenderBase.OVertex>();
                    }
                    break;
                }
            }

            if (currVertices.Count > 0)
            {
                RenderBase.OMesh mesh = new RenderBase.OMesh();
                mesh.vertices   = currVertices;
                mesh.name       = name;
                mesh.hasNormal  = true;
                mesh.texUVCount = 1;
                model.mesh.Add(mesh);
            }

            model.material.Add(new RenderBase.OMaterial());
            output.model.Add(model);
            return(output);
        }
 private void Screen_MouseUp(object sender, MouseEventArgs e)
 {
     if (clicked)
     {
         clicked = false;
         float x = finalMovement.x + (initialMovement.x - e.X);
         float y = finalMovement.y + (initialMovement.y - e.Y);
         if (e.Button == MouseButtons.Right) finalMovement = new RenderBase.OVector2(x, y);
     }
 }
Пример #10
0
        public static RenderBase.OModelGroup load(string fileName)
        {
            FileStream   data  = new FileStream(fileName, FileMode.Open);
            BinaryReader input = new BinaryReader(data);

            RenderBase.OModelGroup models;
            RenderBase.OModel      model;

            string extension   = Path.GetExtension(fileName).ToLower();
            string bchFile     = fileName.Replace(extension, ".bch");
            bool   isBCHLoaded = false;

            if (File.Exists(bchFile))
            {
                models = BCH.load(bchFile);
                model  = models.model[0];
                models.model.Clear();
                isBCHLoaded = true;
            }
            else
            {
                models     = new RenderBase.OModelGroup();
                model      = new RenderBase.OModel();
                model.name = "model";
                model.material.Add(new RenderBase.OMaterial());
            }

            ushort format             = input.ReadUInt16();
            bool   isDataWithinHeader = format == 4;

            input.ReadUInt16(); //-1?
            uint contentFlags = input.ReadUInt32();
            bool hasNameTable = (contentFlags & 2) > 0;
            uint mode         = input.ReadUInt32();
            uint meshCount    = input.ReadUInt32();

            List <vtxEntry> vtxDescriptors = new List <vtxEntry>();
            List <idxEntry> idxDescriptors = new List <idxEntry>();

            for (int i = 0; i < meshCount; i++)
            {
                if (mode == 1 && i == 0)
                {
                    vtxDescriptors.Add(getVtxDescriptor(input));
                }

                uint facesCount = input.ReadUInt32();
                for (int j = 0; j < facesCount; j++)
                {
                    idxEntry face = new idxEntry();
                    face.meshIndex = i;
                    uint nodesCount = input.ReadUInt32();
                    for (int k = 0; k < nodesCount; k++)
                    {
                        face.nodeList.Add(input.ReadUInt32());
                    }
                    face.primitiveCount = input.ReadUInt32();
                    if (hasNameTable)
                    {
                        face.nameId = input.ReadUInt32();
                    }
                    if (isDataWithinHeader)
                    {
                        face.buffer = new ushort[face.primitiveCount];
                        for (int k = 0; k < face.primitiveCount; k++)
                        {
                            face.buffer[k] = input.ReadUInt16();
                        }
                        alignWord(input);
                    }

                    idxDescriptors.Add(face);
                }

                if (mode == 0)
                {
                    if (isDataWithinHeader)
                    {
                        vtxEntry desc = getVtxDescriptor(input);
                        desc.buffer = new byte[desc.length];
                        input.Read(desc.buffer, 0, desc.buffer.Length);
                        vtxDescriptors.Add(desc);
                        alignWord(input);
                    }
                    else
                    {
                        vtxDescriptors.Add(getVtxDescriptor(input));
                    }
                }
            }

            List <string> objNameTable = new List <string>();

            if (hasNameTable)
            {
                for (int i = 0; i < meshCount; i++)
                {
                    byte index = input.ReadByte();
                    objNameTable.Add(IOUtils.readString(input, (uint)data.Position, true));
                }
            }

            if (!isDataWithinHeader)
            {
                align(input);
            }
            byte[]   vtxBuffer  = null;
            vtxEntry currVertex = null;
            int      faceIndex  = 0;

            for (int i = 0; i < meshCount; i++)
            {
                if (mode == 0 || i == 0)
                {
                    currVertex = vtxDescriptors[i];
                    if (!isDataWithinHeader)
                    {
                        vtxBuffer = new byte[vtxDescriptors[i].length];
                        input.Read(vtxBuffer, 0, vtxBuffer.Length);
                        align(input);
                    }
                    else
                    {
                        vtxBuffer = currVertex.buffer;
                    }
                }

                RenderBase.OMesh obj;
                if (isBCHLoaded)
                {
                    obj = model.mesh[0];
                    model.mesh.RemoveAt(0);
                }
                else
                {
                    obj      = new RenderBase.OMesh();
                    obj.name = "mesh_" + i.ToString();
                }

                for (int j = 0; j < currVertex.attributes.Count; j++)
                {
                    switch (currVertex.attributes[j].type)
                    {
                    case vtxAttributeType.normal: obj.hasNormal = true; break;

                    case vtxAttributeType.color: obj.hasColor = true; break;

                    case vtxAttributeType.textureCoordinate0: obj.texUVCount = 1; break;

                    case vtxAttributeType.textureCoordinate1: obj.texUVCount = 2; break;

                    case vtxAttributeType.boneIndex: obj.hasNode = true; break;

                    case vtxAttributeType.boneWeight: obj.hasWeight = true; break;
                    }
                }

                for (;;)
                {
                    int indexBufferPos = 0;
                    for (int j = 0; j < idxDescriptors[faceIndex].primitiveCount; j++)
                    {
                        ushort index;
                        if (isDataWithinHeader)
                        {
                            index = idxDescriptors[faceIndex].buffer[indexBufferPos++];
                        }
                        else
                        {
                            index = input.ReadUInt16();
                        }

                        RenderBase.OVertex vertex = new RenderBase.OVertex();
                        vertex.diffuseColor = 0xffffffff;
                        for (int k = 0; k < currVertex.attributes.Count; k++)
                        {
                            vtxAttribute att   = currVertex.attributes[k];
                            int          pos   = (int)(index * currVertex.stride + att.offset);
                            float        scale = att.scale;
                            switch (currVertex.attributes[k].type)
                            {
                            case vtxAttributeType.position: vertex.position = getVector3(vtxBuffer, pos, att.format, scale); break;

                            case vtxAttributeType.normal: vertex.normal = getVector3(vtxBuffer, pos, att.format, scale); break;

                            case vtxAttributeType.color:
                                RenderBase.OVector4 c = getVector4(vtxBuffer, pos, att.format, scale);
                                uint r = MeshUtils.saturate(c.x * 0xff);
                                uint g = MeshUtils.saturate(c.y * 0xff);
                                uint b = MeshUtils.saturate(c.z * 0xff);
                                uint a = MeshUtils.saturate(c.w * 0xff);
                                vertex.diffuseColor = b | (g << 8) | (r << 16) | (a << 24);
                                break;

                            case vtxAttributeType.textureCoordinate0: vertex.texture0 = getVector2(vtxBuffer, pos, att.format, scale); break;

                            case vtxAttributeType.textureCoordinate1: vertex.texture1 = getVector2(vtxBuffer, pos, att.format, scale); break;

                            case vtxAttributeType.boneIndex:
                                byte n0 = vtxBuffer[pos];
                                byte n1 = vtxBuffer[pos + 1];
                                vertex.node.Add((int)idxDescriptors[faceIndex].nodeList[n0]);
                                vertex.node.Add((int)idxDescriptors[faceIndex].nodeList[n1]);
                                break;

                            case vtxAttributeType.boneWeight:
                                RenderBase.OVector2 w = getVector2(vtxBuffer, pos, att.format, scale);
                                vertex.weight.Add(w.x);
                                vertex.weight.Add(w.y);
                                break;
                            }
                        }

                        MeshUtils.calculateBounds(model, vertex);
                        obj.vertices.Add(vertex);
                    }

                    faceIndex++;
                    if (!isDataWithinHeader)
                    {
                        align(input);
                    }
                    if (faceIndex >= idxDescriptors.Count)
                    {
                        break;
                    }
                    if (idxDescriptors[faceIndex].meshIndex == i)
                    {
                        continue;
                    }
                    break;
                }

                model.mesh.Add(obj);
            }

            models.model.Add(model);

            data.Close();
            return(models);
        }
Пример #11
0
 private void Screen_MouseUp(object sender, MouseEventArgs e)
 {
     if (clicked)
     {
         clicked = false;
         switch (e.Button)
         {
             case MouseButtons.Right: finalMovement = new RenderBase.OVector2(finalMovement.x + (initialMovement.x - MousePosition.X), finalMovement.y + (initialMovement.y - MousePosition.Y)); break;
         }
     }
 }
Пример #12
0
        /// <summary>
        ///     Imports a Wavefront OBJ model from file.
        /// </summary>
        /// <param name="fileName">The complete file name</param>
        /// <returns></returns>
        public static RenderBase.OModelGroup import(string fileName)
        {
            RenderBase.OModelGroup output = new RenderBase.OModelGroup();
            RenderBase.OModel model = new RenderBase.OModel();

            string obj = File.ReadAllText(fileName);

            List<RenderBase.OVector3> vertices = new List<RenderBase.OVector3>();
            List<RenderBase.OVector3> normals = new List<RenderBase.OVector3>();
            List<RenderBase.OVector2> uvs = new List<RenderBase.OVector2>();
            List<RenderBase.OVertex> currVertices = new List<RenderBase.OVertex>();

            string name = string.Empty, oldName;
            string[] lines = obj.Split((char)0xa);
            foreach (string l in lines)
            {
                string line = l.Trim();
                string[] lineParams = Regex.Split(line, "\\s+");

                switch (lineParams[0])
                {
                    case "v":
                    case "vn":
                        RenderBase.OVector3 pvec = new RenderBase.OVector3();
                        pvec.x = float.Parse(lineParams[1], CultureInfo.InvariantCulture);
                        pvec.y = float.Parse(lineParams[2], CultureInfo.InvariantCulture);
                        pvec.z = float.Parse(lineParams[3], CultureInfo.InvariantCulture);
                        if (lineParams[0] == "v") vertices.Add(pvec); else normals.Add(pvec);
                        break;
                    case "vt":
                        RenderBase.OVector2 tvec = new RenderBase.OVector2();
                        tvec.x = float.Parse(lineParams[1], CultureInfo.InvariantCulture);
                        tvec.y = float.Parse(lineParams[2], CultureInfo.InvariantCulture);
                        uvs.Add(tvec);
                        break;
                    case "f":
                        string[][] vtx = new string[lineParams.Length - 1][];
                        for (int i = 0; i < lineParams.Length - 1; i++)
                        {
                            vtx[i] = lineParams[i + 1].Split('/');
                        }

                        for (int i = 0; i < lineParams.Length - 1; i++)
                        {
                            RenderBase.OVertex vertex = new RenderBase.OVertex();

                            vertex.position = vertices[int.Parse(vtx[i][0]) - 1];
                            if (vtx[i].Length > 1 && vtx[i][1] != string.Empty) vertex.texture0 = uvs[int.Parse(vtx[i][1]) - 1];
                            if (vtx[i].Length > 2) vertex.normal = normals[int.Parse(vtx[i][2]) - 1];
                            vertex.diffuseColor = 0xffffffff;

                            if (i > 2)
                            {
                                currVertices.Add(currVertices[currVertices.Count - 3]);
                                currVertices.Add(currVertices[currVertices.Count - 2]);
                                currVertices.Add(vertex);
                            }
                            else
                                currVertices.Add(vertex);
                        }
                        break;
                    case "g":
                        oldName = name;
                        if (lineParams.Length > 1)
                            name = lineParams[1];
                        else
                            name = "mesh";

                        if (currVertices.Count > 0)
                        {
                            RenderBase.OMesh mesh = new RenderBase.OMesh();
                            mesh.vertices = currVertices;
                            mesh.name = oldName;
                            mesh.hasNormal = true;
                            mesh.texUVCount = 1;
                            model.mesh.Add(mesh);

                            currVertices = new List<RenderBase.OVertex>();
                        }
                        break;
                }
            }

            if (currVertices.Count > 0)
            {
                RenderBase.OMesh mesh = new RenderBase.OMesh();
                mesh.vertices = currVertices;
                mesh.name = name;
                mesh.hasNormal = true;
                mesh.texUVCount = 1;
                model.mesh.Add(mesh);
            }

            model.material.Add(new RenderBase.OMaterial());
            output.model.Add(model);
            return output;
        }