Beispiel #1
0
        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);
                            }
                        }
                    }
                }
            }
        }
Beispiel #2
0
        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;
        }