private void Render() { if (selectedObj != null) { if (render3D) { glHelper.Camera.Update(); /* Set projection, modelview */ glHelper.ProjectionType = ProjectionType.Perspective; glHelper.ZNear = 0.01f; glHelper.ZFar = 1000.0f; /* Activate default shader */ glHelper.Shaders.ActivateProgram(Rendering.DefaultShaderName); /* Set shader uniforms */ glHelper.Shaders.SetUniformMatrix(Rendering.DefaultShaderName, "projectionMatrix", false, glHelper.CreateProjectionMatrix()); glHelper.Shaders.SetUniformMatrix(Rendering.DefaultShaderName, "modelviewMatrix", false, Matrix4.Identity); glHelper.Shaders.SetUniformMatrix(Rendering.DefaultShaderName, "objectMatrix", false, Matrix4.Identity); glHelper.Shaders.SetUniform(Rendering.DefaultShaderName, "cameraPosition", glHelper.Camera.Position); glHelper.Shaders.SetUniform(Rendering.DefaultShaderName, "enableLight", Convert.ToInt32(Properties.Settings.Default.EnableLighting)); if (Properties.Settings.Default.EnableLighting) { Rendering.ApplyLightRotation(); Rendering.UpdateLightUniforms(Rendering.DefaultShaderName, "numLights", "lights"); } /* Render each known object */ foreach (string glObjectName in glObjectNames) { /* Activate object's texture */ glHelper.Textures.ActivateTexture(glObjectName, TextureUnit.Texture0); if (glObjectMatrixMap.ContainsKey(glObjectName)) { glHelper.Shaders.SetUniformMatrix(Rendering.DefaultShaderName, "objectMatrix", false, glObjectMatrixMap[glObjectName]); } /* Render */ glHelper.Buffers.Render(glObjectName); } /* Render light visualization */ if (Properties.Settings.Default.EnableLighting) { Rendering.RenderLightVisualization(); } } else { Matrix4 modelviewMatrix2D = Matrix4.CreateTranslation((glHelper.Viewport.Width / 2), (glHelper.Viewport.Height / 2), 0.0f); Matrix4 modelviewWithImageOffset = Matrix4.Mult(modelviewMatrix2D, Matrix4.CreateTranslation(imageOffset.X, imageOffset.Y, 0.0f)); /* Set projection, modelview */ glHelper.ProjectionType = ProjectionType.Orthographic; glHelper.ZNear = -10.0f; glHelper.ZFar = 10.0f; /* Activate empty dummy texture */ glHelper.Textures.ActivateTexture(Rendering.EmptyTextureName, TextureUnit.Texture0); /* Activate default shader */ glHelper.Shaders.ActivateProgram(Rendering.DefaultShaderName); /* Set shader uniforms */ glHelper.Shaders.SetUniformMatrix(Rendering.DefaultShaderName, "projectionMatrix", false, glHelper.CreateProjectionMatrix()); glHelper.Shaders.SetUniformMatrix(Rendering.DefaultShaderName, "modelviewMatrix", false, modelviewMatrix2D); glHelper.Shaders.SetUniformMatrix(Rendering.DefaultShaderName, "objectMatrix", false, Matrix4.Identity); glHelper.Shaders.SetUniform(Rendering.DefaultShaderName, "enableLight", 0); /* Render */ glHelper.Buffers.Render(Rendering.AxisMarkerObjectName); if (selectedObj != null) { /* Set shader uniforms */ glHelper.Shaders.SetUniformMatrix(Rendering.DefaultShaderName, "modelviewMatrix", false, modelviewWithImageOffset); if (selectedObj is AnimationData) { /* Render animation */ AnimationData anim = (selectedObj as AnimationData); if (anim.FirstNode != null) { currentMatrix = Matrix4.Identity; RenderAnimationNode(anim.FirstNode); } } else if (selectedObj is AnimationFrameData) { AnimationFrameData animFrame = (selectedObj as AnimationFrameData); currentMatrix = Matrix4.Identity; RenderAnimationFrame(animFrame, Vector2.Zero); } else if (selectedObj is ImageInformation || selectedObj is SpriteData || selectedObj is TxpImage) { foreach (string glObjectName in glObjectNames) { /* Activate object's texture */ glHelper.Textures.ActivateTexture(glObjectName, TextureUnit.Texture0); /* Set matrices */ Matrix4 translationMatrix = Matrix4.Identity; if (selectedObj is ImageInformation) { ImageInformation image = (selectedObj as ImageInformation); translationMatrix = Matrix4.CreateTranslation(-(image.Bitmap.Width / 2), -(image.Bitmap.Height / 2), 0.0f); } else if (selectedObj is SpriteData) { SpriteData sprite = (selectedObj as SpriteData); translationMatrix = Matrix4.CreateTranslation(-(sprite.Image.Width / 2), -(sprite.Image.Height / 2), 0.0f); } else if (selectedObj is TxpImage) { TxpImage txp = (selectedObj as TxpImage); translationMatrix = Matrix4.CreateTranslation(-(txp.Image.Width / 2), -(txp.Image.Height / 2), 0.0f); } glHelper.Shaders.SetUniformMatrix(Rendering.DefaultShaderName, "objectMatrix", false, translationMatrix); /* Render object */ glHelper.Buffers.Render(glObjectName); } } } } } }
private void tvObject_AfterSelect(object sender, TreeViewEventArgs e) { pgObject.SelectedObject = e.Node.Tag; /* TODO: a more sensible way of encapsulating rendering-related code instead of this mess and Render() below... */ ClearObjects(); if (selectedObj is NisPackFile) { NisPackFile file = (selectedObj as NisPackFile); e.Node.ContextMenuStrip = cmsTreeNode; sfdDataFile.Filter = "All Files (*.*)|*.*"; sfdDataFile.FileName = file.DecompressedFilename; if (e.Node.Nodes.Count == 0) { if (file.DetectedFileType != null) { string path = Path.Combine(Path.GetTempPath(), Path.GetFileNameWithoutExtension(Path.GetRandomFileName()) + "_" + file.DecompressedFilename); file.ParentFile.ExtractFile(file, path); object tempObject = (BaseFile)Activator.CreateInstance(file.DetectedFileType, new object[] { path }); e.Node.Nodes.Add(FileHelpers.TraverseObject(e.Node, file.DecompressedFilename, tempObject, true)); if (File.Exists(path)) { File.Delete(path); } } } } else if (selectedObj is PacFile) { PacFile file = (selectedObj as PacFile); e.Node.ContextMenuStrip = cmsTreeNode; sfdDataFile.Filter = "All Files (*.*)|*.*"; sfdDataFile.FileName = file.Filename; if (e.Node.Nodes.Count == 0) { if (file.DetectedFileType != null) { string path = Path.Combine(Path.GetTempPath(), Path.GetFileNameWithoutExtension(Path.GetRandomFileName()) + "_" + file.Filename); file.ParentFile.ExtractFile(file, path); object tempObject = (BaseFile)Activator.CreateInstance(file.DetectedFileType, new object[] { path }); e.Node.Nodes.Add(FileHelpers.TraverseObject(e.Node, file.Filename, tempObject, true)); if (File.Exists(path)) { File.Delete(path); } } } } else if (selectedObj is ImageInformation) { e.Node.ContextMenuStrip = cmsTreeNode; sfdDataFile.Filter = "Image Files (*.png)|*.png|All Files (*.*)|*.*"; ImageInformation image = (selectedObj as ImageInformation); glObjectNames.Add(image.PrepareRender(glHelper)); render3D = false; } else if (selectedObj is SpriteData) { e.Node.ContextMenuStrip = cmsTreeNode; sfdDataFile.Filter = "Image Files (*.png)|*.png|All Files (*.*)|*.*"; SpriteData sprite = (selectedObj as SpriteData); glObjectNames.Add(sprite.PrepareRender(glHelper)); render3D = false; } else if (selectedObj is ObfPrimitiveListEntry) { ObfPrimitiveListEntry primitiveListEntry = (selectedObj as ObfPrimitiveListEntry); string primitiveListName = primitiveListEntry.PrepareRender(glHelper); glObjectNames.Add(primitiveListName); //if (!glObjectMatrixMap.ContainsKey(primitiveListName)) glObjectMatrixMap.Add(primitiveListName, Matrix4.Identity); render3D = true; } else if (selectedObj is ObfGroupListEntry) { ObfGroupListEntry groupListEntry = (selectedObj as ObfGroupListEntry); List <string> groupListNames = groupListEntry.PrepareRender(glHelper); glObjectNames.AddRange(groupListNames); foreach (string groupListName in groupListNames) { if (!glObjectMatrixMap.ContainsKey(groupListName)) { glObjectMatrixMap.Add(groupListName, Matrix4.Identity); } } render3D = true; } else if (selectedObj is ObfNodeListEntry) { ObfNodeListEntry nodeListEntry = (selectedObj as ObfNodeListEntry); if (nodeListEntry.Group != null) { List <string> nodeListNames = nodeListEntry.Group.PrepareRender(glHelper); glObjectNames.AddRange(nodeListNames); foreach (string nodeListName in nodeListNames) { if (!glObjectMatrixMap.ContainsKey(nodeListName)) { glObjectMatrixMap.Add(nodeListName, nodeListEntry.GetTransformationMatrix(0)); } } } render3D = true; } else if (selectedObj is ObfObjectListEntry) { ObfObjectListEntry objectListEntry = (selectedObj as ObfObjectListEntry); foreach (ObfNodeListEntry nodeListEntry in objectListEntry.Nodes.Where(x => x.Group != null)) { List <string> nodeListNames = nodeListEntry.Group.PrepareRender(glHelper); glObjectNames.AddRange(nodeListNames); foreach (string nodeListName in nodeListNames) { if (!glObjectMatrixMap.ContainsKey(nodeListName)) { glObjectMatrixMap.Add(nodeListName, nodeListEntry.GetTransformationMatrix(0)); } } } render3D = true; } else if (selectedObj is MapChr) { MapChr mapChrFile = (selectedObj as MapChr); /* TEMP map chr unit paint test thing */ if (Environment.MachineName == "NANAMI-X") // :P { const int unitSize = 6; using (Bitmap bmp = new Bitmap(512, 512)) { using (Graphics g = Graphics.FromImage(bmp)) { g.Clear(Color.Black); int centerX = bmp.Width / 2; int centerY = bmp.Height / 2; foreach (MapChrUnit unit in mapChrFile.Units) { g.FillRectangle(Brushes.Gray, new Rectangle(unit.PositionX, unit.PositionZ, unitSize, unitSize)); g.DrawString(string.Format("{0}\n{1}\n{2}", unit.PositionX, unit.PositionY, unit.PositionZ), DefaultFont, Brushes.White, unit.PositionX, unit.PositionZ); } } bmp.Save(@"C:\temp\d4-map.png"); } } //todo! } else if (selectedObj is TxpImage) { e.Node.ContextMenuStrip = cmsTreeNode; sfdDataFile.Filter = "Image Files (*.png)|*.png|All Files (*.*)|*.*"; TxpImage txp = (selectedObj as TxpImage); glObjectNames.Add(txp.PrepareRender(glHelper)); render3D = false; } animCounter = 0; maxCounter = 0; }