コード例 #1
0
        /// <summary>
        /// A helper method to set a material option block layout.
        /// </summary>
        public virtual void SetMaterialOptionsBlock(FMAT mat, UniformBlock block)
        {
            var uniformBlock = ShaderModel.UniformBlocks.Values.FirstOrDefault(
                x => x.Type == (BfshaLibrary.UniformBlock.BlockType) 4);

            //Fill the buffer by program offsets
            var mem = new System.IO.MemoryStream();

            using (var writer = new Toolbox.Core.IO.FileWriter(mem))
            {
                writer.SeekBegin(0);

                int index = 0;
                foreach (var param in uniformBlock.Uniforms.Values)
                {
                    var uniformName = uniformBlock.Uniforms.GetKey(index++);

                    writer.SeekBegin(param.Offset - 1);
                    if (mat.ShaderOptions.ContainsKey(uniformName))
                    {
                        var option = mat.ShaderOptions[uniformName];
                        int value  = int.Parse(option);
                        writer.Write(value);
                    }
                }
            }

            block.Buffer.Clear();
            block.Buffer.AddRange(mem.ToArray());
        }
コード例 #2
0
        private void SetEnvUniforms(GLContext control, UniformBlock block)
        {
            Fog[] fog = new Fog[4];
            for (int i = 0; i < 4; i++)
            {
                fog[i] = new Fog();
            }

            fog[0] = new Fog()
            {
                Start     = 1000000,
                End       = 1000000,
                Color     = new Vector4(1, 0, 0, 1),
                Direciton = new Vector3(0, 1, 0),
            };

            if (AreaIndex != -1 && control.EnableFog)
            {
                var courseArea = LightingEngine.LightSettings.Resources.EnvFiles["course_area.baglenv"];
                var areaFog    = courseArea.GetAreaFog(false, AreaIndex);

                if (areaFog != null && areaFog.Enable)
                {
                    var color = areaFog.Color.ToColorF();
                    fog[0] = new Fog()
                    {
                        Start     = areaFog.Start,
                        End       = areaFog.End,
                        Color     = new Vector4(color.X, color.Y, color.Z, color.W),
                        Direciton = new Vector3(
                            areaFog.Direction.X,
                            areaFog.Direction.Y,
                            areaFog.Direction.Z),
                    };
                }
            }

            var mem = new MemoryStream();

            using (var writer = new Toolbox.Core.IO.FileWriter(mem))
            {
                writer.SeekBegin(10 * 16);
                for (int i = 0; i < 1; i++)
                {
                    writer.Write(fog[i].Color);
                    writer.Write(fog[i].Direciton);
                    writer.Write(fog[i].StartC);
                    writer.Write(fog[i].EndC);
                }

                float amount = 0.1f;

                writer.Write(new Vector4(1, 0, 0, amount));
                writer.Write(new Vector3(0.6771527f, -0.4863142f, 131.3442f));
            }

            block.Buffer.Clear();
            block.Add(mem.ToArray());
        }
コード例 #3
0
 public void Write(Toolbox.Core.IO.FileWriter writer)
 {
     writer.Write(shadow_color);
     writer.Write(ao_color);
     writer.Write(lighting);
     writer.Write(lighting_specular);
     writer.Write(light_prepass_param);
     writer.Write(exposure);
 }
コード例 #4
0
        private void SetViewportUniforms(Camera camera, UniformBlock block)
        {
            var viewMatrix     = camera.ViewMatrix;
            var projMatrix     = camera.ProjectionMatrix;
            var viewProjMatrix = camera.ViewProjectionMatrix;

            Vector4[] cView = new Vector4[3]
            {
                viewMatrix.Column0,
                viewMatrix.Column1,
                viewMatrix.Column2,
            };
            Vector4[] cProj = new Vector4[4]
            {
                projMatrix.Column0,
                projMatrix.Column1,
                projMatrix.Column2,
                projMatrix.Column3,
            };

            var direction = Vector3.TransformNormal(new Vector3(0f, 0f, -1f),
                                                    viewProjMatrix.Inverted()).Normalized();

            //Fill the buffer by program offsets
            var mem = new System.IO.MemoryStream();

            using (var writer = new Toolbox.Core.IO.FileWriter(mem))
            {
                writer.SeekBegin(0);

                writer.Write(cProj[0]);
                writer.Write(cProj[1]);
                writer.Write(cProj[2]);
                writer.Write(cProj[3]);

                writer.Write(cView[0]);
                writer.Write(cView[1]);
                writer.Write(cView[2]);

                writer.SeekBegin(112);
                writer.Write(direction);
            }

            block.Buffer.Clear();
            block.Buffer.AddRange(mem.ToArray());
        }
コード例 #5
0
        private void SetUser0Uniforms(UniformBlock block)
        {
            float   drumAngle     = 35.0f;
            float   drumOffset    = 0.0f;
            Vector2 drumIntensity = new Vector2(0);
            Vector4 pLightPos     = new Vector4(160, 28, 160, 1.0f);

            Vector4[] pLightColor = new Vector4[39];
            pLightColor[0] = new Vector4();
            pLightColor[1] = new Vector4(10, 0.35f, 1.5f, 1.0f);
            pLightColor[2] = new Vector4(2, 0.5f, 0.05f, 1.0f);
            pLightColor[3] = new Vector4(7.2f, 1.05f, 1f, 1.0f);
            pLightColor[4] = new Vector4(0.2f, 0, 0, 0);
            pLightColor[5] = new Vector4();
            pLightColor[6] = new Vector4();

            var mem = new System.IO.MemoryStream();

            using (var writer = new Toolbox.Core.IO.FileWriter(mem))
            {
                writer.Write(Properties.Resources.ACUser1);

                writer.SeekBegin(736);
                writer.Write(drumAngle);
                writer.Write(drumOffset);
                writer.Write(drumIntensity);
                writer.Write(pLightPos);

                /*  for (int i = 0; i < pLightColor.Length; i++)
                 *    writer.Write(pLightColor[i]);
                 *
                 * writer.SeekBegin(1168);
                 * writer.Write(new Vector4(1));
                 */
            }

            block.Buffer.Clear();
            block.Buffer.AddRange(mem.ToArray());
        }
コード例 #6
0
        private void SetLightUniforms(UniformBlock block)
        {
            var mem = new System.IO.MemoryStream();

            using (var writer = new Toolbox.Core.IO.FileWriter(mem))
            {
                writer.SeekBegin(0);
                writer.Write(LightingData.General.ColorHemiUpper);
                writer.Write(LightingData.Land.ColorHemiUpper);
                writer.Write(LightingData.BG.ColorHemiUpper);
                writer.Write(LightingData.General.ColorHemiLower);
                writer.Write(LightingData.Land.ColorHemiLower);
                writer.Write(LightingData.BG.ColorHemiLower);

                writer.Write(LightingData.General.Direction);
                writer.Write(0);
                writer.Write(LightingData.Land.Direction);
                writer.Write(0);
                writer.Write(LightingData.BG.Direction);
                writer.Write(0);

                writer.Write(LightingData.General.DirectionalColor);
                writer.Write(LightingData.Land.DirectionalColor);
                writer.Write(LightingData.BG.DirectionalColor);

                writer.SeekBegin(480);

                writer.Write(new Vector4(LightingData.General.ColorHemiUpperMaxRot, 0, 0, 0));
                writer.Write(new Vector4(LightingData.Land.ColorHemiUpperMaxRot, 0, 0, 0));
                writer.Write(new Vector4(LightingData.BG.ColorHemiUpperMaxRot, 0, 0, 0));
                writer.Write(new Vector4(LightingData.General.ColorHemiLowerMaxRot, 0, 0, 0));
                writer.Write(new Vector4(LightingData.Land.ColorHemiLowerMaxRot, 0, 0, 0));
                writer.Write(new Vector4(LightingData.BG.ColorHemiLowerMaxRot, 0, 0, 0));
            }

            block.Buffer.Clear();
            block.Buffer.AddRange(mem.ToArray());
        }
コード例 #7
0
        private void SetEnvUniforms(UniformBlock block)
        {
            Fog[] fog = new Fog[4];
            for (int i = 0; i < 4; i++)
            {
                fog[i] = new Fog();
            }

            fog[0] = new Fog()
            {
                Start     = 1000000,
                End       = 1000000,
                Color     = new Vector4(1, 0, 0, 1),
                Direciton = new Vector3(0, 1, 0),
            };

            var mem = new MemoryStream();

            using (var writer = new Toolbox.Core.IO.FileWriter(mem))
            {
                writer.SeekBegin(10 * 16);
                for (int i = 0; i < 1; i++)
                {
                    writer.Write(fog[i].Color);
                    writer.Write(fog[i].Direciton);
                    writer.Write(fog[i].StartC);
                    writer.Write(fog[i].EndC);
                }

                float amount = 0.1f;

                writer.Write(new Vector4(1, 0, 0, amount));
                writer.Write(new Vector3(0.6771527f, -0.4863142f, 131.3442f));
            }

            block.Buffer.Clear();
            block.Add(mem.ToArray());
        }
コード例 #8
0
        private void SetViewportUniforms(Camera camera, UniformBlock block)
        {
            var viewMatrix        = camera.ViewMatrix;
            var viewInvMatrix     = camera.ViewMatrix.Inverted();
            var projMatrix        = camera.ProjectionMatrix;
            var projViewMatrix    = viewMatrix * projMatrix;
            var projViewInvMatrix = projViewMatrix.Inverted();

            Vector4[] cView = new Vector4[3]
            {
                viewMatrix.Column0,
                viewMatrix.Column1,
                viewMatrix.Column2,
            };
            Vector4[] cViewInv = new Vector4[3]
            {
                viewInvMatrix.Column0,
                viewInvMatrix.Column1,
                viewInvMatrix.Column2,
            };
            Vector4[] cProjView = new Vector4[4]
            {
                projViewMatrix.Column0,
                projViewMatrix.Column1,
                projViewMatrix.Column2,
                projViewMatrix.Column3,
            };
            Vector4[] cProjViewInv = new Vector4[3]
            {
                projViewInvMatrix.Column0,
                projViewInvMatrix.Column1,
                projViewInvMatrix.Column2,
            };

            //Fill the buffer by program offsets
            var mem = new System.IO.MemoryStream();

            using (var writer = new Toolbox.Core.IO.FileWriter(mem))
            {
                writer.SeekBegin(0);

                writer.Write(cView[0]);
                writer.Write(cView[1]);
                writer.Write(cView[2]);

                writer.Write(cViewInv[0]);
                writer.Write(cViewInv[1]);
                writer.Write(cViewInv[2]);

                writer.Write(cProjView[0]);
                writer.Write(cProjView[1]);
                writer.Write(cProjView[2]);
                writer.Write(cProjView[3]);

                writer.Write(cProjViewInv[0]);
                writer.Write(cProjViewInv[1]);
                writer.Write(cProjViewInv[2]);
            }

            block.Buffer.Clear();
            block.Buffer.AddRange(mem.ToArray());
        }
コード例 #9
0
        /// <summary>
        /// A helper method to set a material parameter block layout.
        /// </summary>
        public virtual void SetMaterialBlock(FMAT mat, UniformBlock block)
        {
            //Fill the buffer by program offsets
            var mem = new System.IO.MemoryStream();

            using (var writer = new Toolbox.Core.IO.FileWriter(mem))
            {
                writer.SeekBegin(0);
                var matBlock = ShaderModel.UniformBlocks.Values.FirstOrDefault(x =>
                                                                               x.Type == BfshaLibrary.UniformBlock.BlockType.Material);

                int index = 0;
                foreach (var param in matBlock.Uniforms.Values)
                {
                    var uniformName = matBlock.Uniforms.GetKey(index++);

                    writer.SeekBegin(param.Offset - 1);
                    if (mat.ShaderParams.ContainsKey(uniformName))
                    {
                        var matParam = mat.ShaderParams[uniformName];
                        if (mat.AnimatedParams.ContainsKey(uniformName))
                        {
                            matParam = mat.AnimatedParams[uniformName];
                        }

                        if (matParam.Type == BfresLibrary.ShaderParamType.TexSrtEx) //Texture matrix (texmtx)
                        {
                            writer.Write(CalculateSRT3x4((BfresLibrary.TexSrt)matParam.DataValue));
                        }
                        else if (matParam.Type == BfresLibrary.ShaderParamType.TexSrt)
                        {
                            writer.Write(CalculateSRT2x3((BfresLibrary.TexSrt)matParam.DataValue));
                        }
                        else if (matParam.DataValue is BfresLibrary.Srt2D) //Indirect SRT (ind_texmtx)
                        {
                            writer.Write(CalculateSRT((BfresLibrary.Srt2D)matParam.DataValue));
                        }
                        else if (matParam.DataValue is float)
                        {
                            writer.Write((float)matParam.DataValue);
                        }
                        else if (matParam.DataValue is float[])
                        {
                            writer.Write((float[])matParam.DataValue);
                        }
                        else if (matParam.DataValue is int[])
                        {
                            writer.Write((int[])matParam.DataValue);
                        }
                        else if (matParam.DataValue is uint[])
                        {
                            writer.Write((uint[])matParam.DataValue);
                        }
                        else if (matParam.DataValue is int)
                        {
                            writer.Write((int)matParam.DataValue);
                        }
                        else if (matParam.DataValue is uint)
                        {
                            writer.Write((uint)matParam.DataValue);
                        }
                        else
                        {
                            throw new Exception($"Unsupported render type! {matParam.Type}");
                        }
                    }
                }
            }

            block.Buffer.Clear();
            block.Buffer.AddRange(mem.ToArray());
        }
コード例 #10
0
        private void SetViewportUniforms(Camera camera, UniformBlock block)
        {
            var modelMatrix = this.ParentRenderer.Transform.TransformMatrix;

            var viewMatrix        = camera.ViewMatrix;
            var viewInvMatrix     = camera.ViewMatrix.Inverted();
            var projMatrix        = camera.ProjectionMatrix;
            var projViewMatrix    = modelMatrix * viewMatrix * projMatrix;
            var projViewInvMatrix = projViewMatrix.Inverted();
            var projMatrixInv     = projMatrix.Inverted();

            Vector4[] cView = new Vector4[3]
            {
                viewMatrix.Column0,
                viewMatrix.Column1,
                viewMatrix.Column2,
            };
            Vector4[] cViewInv = new Vector4[3]
            {
                viewInvMatrix.Column0,
                viewInvMatrix.Column1,
                viewInvMatrix.Column2,
            };
            Vector4[] cProjView = new Vector4[4]
            {
                projViewMatrix.Column0,
                projViewMatrix.Column1,
                projViewMatrix.Column2,
                projViewMatrix.Column3,
            };
            Vector4[] cProjViewInv = new Vector4[3]
            {
                projViewInvMatrix.Column0,
                projViewInvMatrix.Column1,
                projViewInvMatrix.Column2,
            };
            Vector4[] cProjInv = new Vector4[4]
            {
                projMatrixInv.Column0,
                projMatrixInv.Column1,
                projMatrixInv.Column2,
                projMatrixInv.Column3,
            };

            projViewInvMatrix.ClearTranslation();

            Vector4[] cProjViewInvNoPos = new Vector4[3]
            {
                projViewInvMatrix.Column0,
                projViewInvMatrix.Column1,
                projViewInvMatrix.Column2,
            };

            var mem = new System.IO.MemoryStream();

            using (var writer = new Toolbox.Core.IO.FileWriter(mem))
            {
                writer.SeekBegin(0);

                writer.Write(cView[0]);
                writer.Write(cView[1]);
                writer.Write(cView[2]);

                writer.Write(cViewInv[0]);
                writer.Write(cViewInv[1]);
                writer.Write(cViewInv[2]);

                writer.Write(cProjView[0]);
                writer.Write(cProjView[1]);
                writer.Write(cProjView[2]);
                writer.Write(cProjView[3]);

                writer.Write(cProjViewInv[0]);
                writer.Write(cProjViewInv[1]);
                writer.Write(cProjViewInv[2]);

                writer.Write(cProjInv[0]);
                writer.Write(cProjInv[1]);
                writer.Write(cProjInv[2]);
                writer.Write(cProjInv[3]);

                writer.Write(cProjViewInvNoPos[0]);
                writer.Write(cProjViewInvNoPos[1]);
                writer.Write(cProjViewInvNoPos[2]);

                writer.Write(1);    // vec4[20].x
                writer.Write(1.0f); //Exposure used for the half texture
                writer.Write(0);
                writer.Write(0);

                writer.Write(0.3811009f);
                writer.Write(0.5090417f);
                writer.Write(0.7717764f);
                writer.Write(1.0f);
            }

            block.Buffer.Clear();
            block.Buffer.AddRange(mem.ToArray());
        }
コード例 #11
0
        private void SetViewportUniforms(Camera camera, UniformBlock block)
        {
            Matrix4 mdlMat         = camera.ModelMatrix;
            var     viewMatrix     = ParentTransform * camera.ViewMatrix;
            var     projMatrix     = camera.ProjectionMatrix;
            var     viewInverted   = viewMatrix.Inverted();
            var     viewProjMatrix = mdlMat * viewMatrix * projMatrix;

            float znear     = 1.0f;
            float zfar      = 100000.00f;
            float zDistance = zfar - znear;

            Vector4[] cView = new Vector4[3]
            {
                viewMatrix.Column0,
                viewMatrix.Column1,
                viewMatrix.Column2,
            };
            Vector4[] cViewProj = new Vector4[4]
            {
                viewProjMatrix.Column0,
                viewProjMatrix.Column1,
                viewProjMatrix.Column2,
                viewProjMatrix.Column3,
            };
            Vector4[] cProj = new Vector4[4]
            {
                projMatrix.Column0,
                projMatrix.Column1,
                projMatrix.Column2,
                projMatrix.Column3,
            };
            Vector4[] cViewInv = new Vector4[3]
            {
                viewInverted.Column0,
                viewInverted.Column1,
                viewInverted.Column2,
            };

            //Fill the buffer by program offsets
            var mem = new System.IO.MemoryStream();

            using (var writer = new Toolbox.Core.IO.FileWriter(mem))
            {
                writer.SeekBegin(0);
                writer.Write(cView[0]);
                writer.Write(cView[1]);
                writer.Write(cView[2]);

                writer.Write(cViewProj[0]);
                writer.Write(cViewProj[1]);
                writer.Write(cViewProj[2]);
                writer.Write(cViewProj[3]);

                writer.Write(cProj[0]);
                writer.Write(cProj[1]);
                writer.Write(cProj[2]);
                writer.Write(cProj[3]);

                writer.Write(cViewInv[0]);
                writer.Write(cViewInv[1]);
                writer.Write(cViewInv[2]);
                writer.Write(new Vector4(znear, zfar, zfar / znear, 1.0f - znear / zfar));
                writer.Write(new Vector4(1.0f / zDistance, znear / zDistance, camera.AspectRatio, 1.0f / camera.AspectRatio));
                writer.Write(new Vector4(zDistance, 0, 0, 0));


                writer.SeekBegin(656);
                writer.Write(0.55f);
                writer.Write(1);

                writer.SeekBegin(1024);
                //Cubemap params
                writer.Write(1024.0f);
                writer.Write(4.0f);
                writer.Write(1.0f);
                writer.Write(1.0f);
            }

            block.Buffer.Clear();
            block.Buffer.AddRange(mem.ToArray());
        }
コード例 #12
0
        private void SetSceneMatUniforms(UniformBlock block)
        {
            Vector4 toon_light_adjust   = new Vector4(1);
            float   cloud_ratio         = 1.0f;
            float   depth_shadow_offset = 0;
            float   proj_shadow_offset  = 0;
            float   rain_ratio          = 0;
            float   rainfall            = 0;
            float   exposure            = 0;
            float   world_shadow_offset = 0;
            float   base_light_ratio    = 0;
            float   main_light          = 1;
            float   sky_occ_offset      = 0;
            float   depth_shadow_scale  = 1;
            float   item_filter_alpha   = 0;
            float   ui_highlight        = 0;
            float   proj_discard_scale1 = 0.12f;
            float   proj_discard_scale2 = 0.85f;
            float   proj_discard_scale3 = 2.5f;
            float   debug0 = 0.8f;
            float   debug1 = 0;
            float   debug2 = 0.4f;
            float   debug3 = 1.0f;

            var mem = new System.IO.MemoryStream();

            using (var writer = new Toolbox.Core.IO.FileWriter(mem))
            {
                writer.SeekBegin(0);
                writer.Write(toon_light_adjust);
                writer.Write(cloud_ratio);
                writer.Write(depth_shadow_offset);
                writer.Write(proj_shadow_offset);
                writer.Write(rain_ratio);

                writer.Write(rainfall);
                writer.Write(exposure);
                writer.Write(world_shadow_offset);
                writer.Write(base_light_ratio);

                writer.Write(main_light);
                writer.Write(sky_occ_offset);
                writer.Write(depth_shadow_scale);
                writer.Write(item_filter_alpha);

                writer.Write(ui_highlight);
                writer.Write(proj_discard_scale1);
                writer.Write(proj_discard_scale2);
                writer.Write(proj_discard_scale3);

                writer.Write(debug0);
                writer.Write(debug1);
                writer.Write(debug2);
                writer.Write(debug3);
            }

            block.Buffer.Clear();
            block.Add(mem.ToArray());

            if (block.Buffer.Count != 96)
            {
                throw new Exception("Invalid gsys_scene_material size");
            }
        }
コード例 #13
0
        public byte[] GetBufferData()
        {
            var strideTotal = Attributes.Sum(x => x.Stride);

            var mem = new System.IO.MemoryStream();

            using (var writer = new Toolbox.Core.IO.FileWriter(mem))
            {
                for (int i = 0; i < Shape.Vertices.Count; i++)
                {
                    foreach (var attribute in Attributes)
                    {
                        if (attribute.Assigned)
                        {
                            continue;
                        }

                        writer.SeekBegin(attribute.Offset + (i * strideTotal));
                        switch (attribute.vertexAttributeName)
                        {
                        case "_p0":
                        {
                            if (MorphPositions.Length > i)
                            {
                                writer.Write(MorphPositions[i]);
                            }
                            else
                            {
                                writer.Write(Shape.Vertices[i].Position);
                            }
                        }
                        break;

                        case "_n0": writer.Write(Shape.Vertices[i].Normal); break;

                        case "_c0": writer.Write(Shape.Vertices[i].Colors[0]); break;

                        case "_c1": writer.Write(Shape.Vertices[i].Colors[1]); break;

                        case "_u0": writer.Write(Shape.Vertices[i].TexCoords[0]); break;

                        case "_u1":
                            if (Shape.Vertices[i].TexCoords.Length > 1)
                            {
                                writer.Write(Shape.Vertices[i].TexCoords[1]);
                            }
                            break;

                        case "_u2":
                            if (Shape.Vertices[i].TexCoords.Length > 2)
                            {
                                writer.Write(Shape.Vertices[i].TexCoords[2]);
                            }
                            break;

                        case "_u3":
                            if (Shape.Vertices[i].TexCoords.Length > 3)
                            {
                                writer.Write(Shape.Vertices[i].TexCoords[3]);
                            }
                            break;

                        case "_u4": writer.Write(Shape.Vertices[i].TexCoords[4]); break;

                        case "_u5": writer.Write(Shape.Vertices[i].TexCoords[5]); break;

                        case "_u6": writer.Write(Shape.Vertices[i].TexCoords[6]); break;

                        case "_u7": writer.Write(Shape.Vertices[i].TexCoords[7]); break;

                        case "_t0": writer.Write(Shape.Vertices[i].Tangent); break;

                        case "_b0": writer.Write(Shape.Vertices[i].Bitangent); break;

                        case "_i0":
                        case "_i1":
                        {
                            int startIndex = 0;
                            if (attribute.vertexAttributeName == "_i1")
                            {
                                startIndex = 4;
                            }

                            for (int j = startIndex; j < startIndex + 4; j++)
                            {
                                if (j < Shape.Vertices[i].BoneIndices.Count)
                                {
                                    writer.Write(Shape.Vertices[i].BoneIndices[j]);
                                }
                                else
                                {
                                    writer.Write(0.0f);
                                }
                            }
                        }
                        break;

                        case "_w0":
                        case "_w1":
                        {
                            int startIndex = 0;
                            if (attribute.vertexAttributeName == "_w1")
                            {
                                startIndex = 4;
                            }

                            if (Shape.Vertices[i].BoneWeights.Count > 0)
                            {
                                for (int j = startIndex; j < startIndex + 4; j++)
                                {
                                    if (j < Shape.Vertices[i].BoneWeights.Count)
                                    {
                                        writer.Write(Shape.Vertices[i].BoneWeights[j]);
                                    }
                                    else
                                    {
                                        writer.Write(0.0f);
                                    }
                                }
                            }
                            else
                            {
                                writer.Write(new Vector4(1, 0, 0, 0));
                            }
                        }
                        break;

                        //Hardcoded extras
                        case "inst0": writer.Write(new Vector4(1, 0, 0, 0)); break;

                        case "inst1": writer.Write(new Vector4(0, 1, 0, 0)); break;

                        case "inst2": writer.Write(new Vector4(0, 0, 1, 0)); break;
                        }
                    }
                }
            }
            return(mem.ToArray());
        }
コード例 #14
0
        private void SetViewportUniforms(Camera camera, UniformBlock block)
        {
            Matrix4 mdlMat         = ParentRenderer.Transform.TransformMatrix;
            var     viewMatrix     = mdlMat * camera.ViewMatrix;
            var     projMatrix     = camera.ProjectionMatrix;
            var     viewInverted   = viewMatrix.Inverted();
            var     viewProjMatrix = viewMatrix * projMatrix;

            float znear = 1.0f;
            float zfar  = 100000.00f;

            Vector4[] cView = new Vector4[3]
            {
                viewMatrix.Column0,
                viewMatrix.Column1,
                viewMatrix.Column2,
            };
            Vector4[] cViewProj = new Vector4[4]
            {
                viewProjMatrix.Column0,
                viewProjMatrix.Column1,
                viewProjMatrix.Column2,
                viewProjMatrix.Column3,
            };
            Vector4[] cProj = new Vector4[4]
            {
                projMatrix.Column0,
                projMatrix.Column1,
                projMatrix.Column2,
                projMatrix.Column3,
            };
            Vector4[] cViewInv = new Vector4[3]
            {
                viewInverted.Column0,
                viewInverted.Column1,
                viewInverted.Column2,
            };

            //Fill the buffer by program offsets
            var mem = new System.IO.MemoryStream();

            using (var writer = new Toolbox.Core.IO.FileWriter(mem))
            {
                writer.SeekBegin(0);

                writer.Write(cView[0]);
                writer.Write(cView[1]);
                writer.Write(cView[2]);

                writer.Write(cViewProj[0]);
                writer.Write(cViewProj[1]);
                writer.Write(cViewProj[2]);
                writer.Write(cViewProj[3]);

                writer.Write(cProj[0]);
                writer.Write(cProj[1]);
                writer.Write(cProj[2]);
                writer.Write(cProj[3]);

                //Inverse view matrix (necessary for reflections)
                writer.Write(cViewInv[0]);
                writer.Write(cViewInv[1]);
                writer.Write(cViewInv[2]);
                writer.Write(new Vector4(znear, zfar, zfar / znear, 1.0f - znear / zfar));

                if (!IsSwitch)
                {
                    writer.SeekBegin(26 * 16);
                    writer.Write(new Vector4(1));

                    //Wii U saves scene params in view block
                    writer.SeekBegin(53 * 16);
                    writer.Write(sceneMaterial.shadow_color);
                    writer.Write(sceneMaterial.ao_color);

                    writer.SeekBegin(70 * 16);
                    writer.Write(sceneMaterial.light_prepass_param);
                    writer.Write(new Vector4(1));
                    writer.Write(sceneMaterial.exposure);
                    writer.Write(sceneMaterial.lighting);
                    writer.Write(new Vector4(1));

                    //Cubemap params
                    writer.Write(1024.0f);
                    writer.Write(4.0f);
                    writer.Write(1.0f);
                    writer.Write(1.0f);
                    writer.Write(new Vector4(1280, 720, 0.0078f, 0.00139f));
                    writer.Write(new Vector4(1, 0, 0, 0)); //Set to 1 for usable ratio lighting
                    writer.Write(sceneMaterial.lighting_specular);
                }
                else
                {
                    writer.SeekBegin(53 * 16);
                    writer.Write(new Vector4(1));

                    writer.SeekBegin(656);
                    writer.Write(0.55f);
                    writer.Write(1);

                    writer.SeekBegin(64 * 16);
                    //Cubemap params
                    writer.Write(1024.0f);
                    writer.Write(4.0f);
                    writer.Write(1.0f);
                    writer.Write(1.0f);
                }
            }

            block.Buffer.Clear();
            block.Buffer.AddRange(mem.ToArray());
        }
コード例 #15
0
        private void SetViewportUniforms(Camera camera, UniformBlock block)
        {
            Matrix4 mdlMat         = ParentRenderer.Transform.TransformMatrix;
            var     viewMatrix     = mdlMat * camera.ViewMatrix;
            var     projMatrix     = camera.ProjectionMatrix;
            var     viewInverted   = viewMatrix.Inverted();
            var     viewProjMatrix = viewMatrix * projMatrix;

            float znear = 1.0f;
            float zfar  = 100000.00f;

            Vector4[] cView = new Vector4[3]
            {
                viewMatrix.Column0,
                viewMatrix.Column1,
                viewMatrix.Column2,
            };
            Vector4[] cViewProj = new Vector4[4]
            {
                viewProjMatrix.Column0,
                viewProjMatrix.Column1,
                viewProjMatrix.Column2,
                viewProjMatrix.Column3,
            };
            Vector4[] cProj = new Vector4[4]
            {
                projMatrix.Column0,
                projMatrix.Column1,
                projMatrix.Column2,
                projMatrix.Column3,
            };
            Vector4[] cViewInv = new Vector4[3]
            {
                viewInverted.Column0,
                viewInverted.Column1,
                viewInverted.Column2,
            };

            //Fill the buffer by program offsets
            var mem = new System.IO.MemoryStream();

            using (var writer = new Toolbox.Core.IO.FileWriter(mem))
            {
                writer.SeekBegin(0);
                writer.Write(cView[0]);
                writer.Write(cView[1]);
                writer.Write(cView[2]);

                writer.Write(cViewProj[0]);
                writer.Write(cViewProj[1]);
                writer.Write(cViewProj[2]);
                writer.Write(cViewProj[3]);

                writer.Write(cProj[0]);
                writer.Write(cProj[1]);
                writer.Write(cProj[2]);
                writer.Write(cProj[3]);

                //Inverse view matrix (necessary for reflections)
                writer.Write(cViewInv[0]);
                writer.Write(cViewInv[1]);
                writer.Write(cViewInv[2]);
                writer.Write(new Vector4(znear, zfar, zfar / znear, 1.0f - znear / zfar));

                writer.SeekBegin(656);
                writer.Write(0.55f);
                writer.Write(1);

                for (int i = 0; i < 200; i++)
                {
                    writer.Write(new Vector4(1));
                }

                writer.SeekBegin(1024);
                //Cubemap params
                writer.Write(1024.0f);
                writer.Write(4.0f);
                writer.Write(1.0f);
                writer.Write(1.0f);
            }

            block.Buffer.Clear();
            block.Buffer.AddRange(mem.ToArray());
        }