public OViewportPanel() { initialRotation = new RenderBase.OVector2(); initialMovement = new RenderBase.OVector2(); finalMovement = new RenderBase.OVector2(); InitializeComponent(); }
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; } } } }
/// <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); } }
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); }
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; } } }
/// <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; }