/// <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()); }
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()); }
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); }
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()); }
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()); }
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()); }
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()); }
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()); }
/// <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()); }
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()); }
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()); }
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"); } }
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()); }
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()); }
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()); }