当前位置: 首页>>代码示例>>C#>>正文


C# Matrix4.MultiplyByTransform方法代码示例

本文整理汇总了C#中Matrix4.MultiplyByTransform方法的典型用法代码示例。如果您正苦于以下问题:C# Matrix4.MultiplyByTransform方法的具体用法?C# Matrix4.MultiplyByTransform怎么用?C# Matrix4.MultiplyByTransform使用的例子?那么恭喜您, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在Matrix4的用法示例。


在下文中一共展示了Matrix4.MultiplyByTransform方法的5个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C#代码示例。

示例1: RenderDynamicEntitySkin

        public void RenderDynamicEntitySkin(LitShaderDescription shader, Entity ent, Matrix4 mvMatrix, Matrix4 pMatrix)
        {
            GL.UniformMatrix4(shader.Projection, false, ref pMatrix);

            for (var i = 0; i < ent.Bf.BoneTags.Count; i++)
            {
                var mat0 = mvMatrix * ent.Bt.BtBody[i].GetWorldTransform();
                var tr1 = new Matrix4();
                // Calculate parent transform
                var btag = ent.Bf.BoneTags[i];
                var foundParentTransform = false;
                for (var j = 0; j < ent.Bf.BoneTags.Count; j++)
                {
                    if(ent.Bf.BoneTags[i] == btag.Parent)
                    {
                        tr1 = ent.Bt.BtBody[j].GetWorldTransform();
                        foundParentTransform = true;
                        break;
                    }
                }
                if (!foundParentTransform)
                    tr1 = (Matrix4) ent.Transform;

                var translate = new Transform();
                translate.SetIdentity();
                translate.Origin += btag.Offset;

                var secondTransform = tr1.MultiplyByTransform(translate);
                var mat1 = mvMatrix * secondTransform;

                var transforms = new float[32];
                unsafe
                {
                    Array.Copy(Helper.GetArrayFromPointer(&mat0.Row0.X, 16), transforms, 16);
                    Array.Copy(Helper.GetArrayFromPointer(&mat1.Row0.X, 16), 0, transforms, 16, 16);
                }
                GL.UniformMatrix4(shader.ModelView, 2, false, transforms);

                if (btag.MeshSkin != null)
                {
                    RenderMesh(btag.MeshSkin);
                }
            }
        }
开发者ID:zdimension,项目名称:FreeRaider,代码行数:44,代码来源:Render.cs

示例2: RenderRoom

        public unsafe void RenderRoom(Room room, Matrix4 modelViewMatrix, Matrix4 modelViewProjectionMatrix, Matrix4 projection)
        {
            var needStencil = false;
            if (STENCIL_FRUSTUM)
            {
                // start test stencil test code
                if(room.Frustum.Any())
                {
                    needStencil = room.OverlappedRoomList.Any(r => renderList.Contains(r));

                    if(needStencil)
                    {
                        var shader = ShaderManager.GetStencilShader();
                        GL.UseProgram(shader.Program);
                        GL.UniformMatrix4(shader.ModelViewProjection, false, ref EngineCamera.GLViewProjMat);
                        GL.Enable(EnableCap.StencilTest);
                        GL.Clear(ClearBufferMask.StencilBufferBit);
                        GL.StencilFunc(StencilFunction.Never, 1, 0x00);
                        GL.StencilOp(StencilOp.Replace, StencilOp.Keep, StencilOp.Keep);

                        var stencilVBO = Helper.GenBufferU();

                        var attribs = new[]
                        {
                            new VertexArrayAttribute((int) UnlitShaderDescription.VertexAttribs.Position, 3,
                                VertexAttribPointerType.Float, false, stencilVBO, 3 * sizeof(float), 0)
                        };

                        var array = new VertexArray(0, 1, attribs);
                        array.Bind();

                        foreach (var f in room.Frustum)
                        {
                            GL.BindBuffer(BufferTarget.ArrayBuffer, stencilVBO);
                            GL.BufferData(BufferTarget.ArrayBuffer, (IntPtr)(f.Vertices.Count * sizeof(Vector3)), IntPtr.Zero, BufferUsageHint.StreamDraw);

                            unsafe
                            {
                                var v = (float*) GL.MapBuffer(BufferTarget.ArrayBuffer, BufferAccess.WriteOnly);

                                foreach(var it in f.Vertices.AsEnumerable().Reverse())
                                {
                                    *v++ = it.X;
                                    *v++ = it.Y;
                                    *v++ = it.Z;
                                }

                                GL.UnmapBuffer(BufferTarget.ArrayBuffer);
                            }

                            GL.DrawArrays(PrimitiveType.TriangleFan, 0, f.Vertices.Count);
                        }

                        GL.StencilFunc(StencilFunction.Equal, 1, 0xFF);
                        GL.DeleteBuffer(stencilVBO);
                    }
                }
            }

            if(!skipRoom && room.Mesh != null)
            {
                var modelViewProjectionTransform = modelViewProjectionMatrix.MultiplyByTransform(room.Transform);

                var shader = ShaderManager.GetRoomShader(room.LightMode == 1, room.Flags.HasFlagUns(1));

                var tint = new float[4];
                EngineWorld.CalculateWaterTint(tint, true);
                GL.UseProgram(shader.Program);

                GL.Uniform4(shader.TintMult, 1, tint);
                GL.Uniform1(shader.CurrentTick, SDL.SDL_GetTicks());
                GL.Uniform1(shader.Sampler, 0);
                GL.UniformMatrix4(shader.ModelViewProjection, false, ref modelViewProjectionTransform);
                RenderMesh(room.Mesh);
            }

            if(room.StaticMesh.Any())
            {
                GL.UseProgram(ShaderManager.GetStaticMeshShader().Program);
                foreach (var sm in room.StaticMesh)
                {
                    if(sm.WasRendered != 0 || !sm.OBB.IsVisibleInRoom(room, Camera))
                    {
                        continue;
                    }

                    if(sm.Hide && !drawDummyStatics)
                    {
                        continue;
                    }

                    var transform = modelViewProjectionMatrix.MultiplyByTransform(sm.Transform);
                    GL.UniformMatrix4(ShaderManager.GetStaticMeshShader().ModelViewProjection, false, ref transform);

                    var tint = sm.Tint.CloneArr();

                    // If this static mesh is in a water room
                    if(room.Flags.HasFlagUns(RoomFlag.Water))
                    {
                        EngineWorld.CalculateWaterTint(tint, false);
//.........这里部分代码省略.........
开发者ID:zdimension,项目名称:FreeRaider,代码行数:101,代码来源:Render.cs

示例3: RenderSkeletalModelSkin

        public void RenderSkeletalModelSkin(LitShaderDescription shader, Entity ent, Matrix4 mvMatrix, Matrix4 pMatrix)
        {
            GL.UniformMatrix4(shader.Projection, false, ref pMatrix);

            foreach (var btag in ent.Bf.BoneTags)
            {
                var transforms = new float[32];
                var mvTransforms = mvMatrix.MultiplyByTransform(btag.FullTransform);
                unsafe
                {
                    Array.Copy(Helper.GetArrayFromPointer(&mvTransforms.Row0.X, 16), transforms, 16);
                }

                // Calculate parent transform
                var parentTransform = btag.Parent == null ? ent.Transform : btag.Parent.FullTransform;

                var translate = new Transform();
                translate.SetIdentity();
                translate.Origin += btag.Offset;

                var secondTransform = parentTransform * translate;

                var mvTransforms2 = mvMatrix.MultiplyByTransform(secondTransform);
                unsafe
                {
                    Array.Copy(Helper.GetArrayFromPointer(&mvTransforms2.Row0.X, 16), 0, transforms, 16, 16);
                }
                GL.UniformMatrix4(shader.ModelView, 2, false, transforms);

                if(btag.MeshSkin != null)
                {
                    RenderMesh(btag.MeshSkin);
                }
            }
        }
开发者ID:zdimension,项目名称:FreeRaider,代码行数:35,代码来源:Render.cs

示例4: RenderSkyBox

        public void RenderSkyBox(Matrix4 modelViewProjectionMatrix)
        {
            if (drawSkybox && World?.SkyBox != null)
            {
                GL.DepthMask(false);
                var tr = new Transform();
                tr.Origin = Camera.Position + World.SkyBox.Animations[0].Frames[0].BoneTags[0].Offset;
                tr.Rotation = World.SkyBox.Animations[0].Frames[0].BoneTags[0].QRotate;
                var fullView = modelViewProjectionMatrix.MultiplyByTransform(tr);

                var shader = ShaderManager.GetStaticMeshShader();
                GL.UseProgram(shader.Program);
                GL.UniformMatrix4(shader.ModelViewProjection, false, ref fullView);
                GL.Uniform1(shader.Sampler, 0);
                var tint = new float[] {1, 1, 1, 1};
                GL.Uniform4(shader.TintMult, 1, tint);

                RenderMesh(World.SkyBox.MeshTree[0].MeshBase);
                GL.DepthMask(true);
            }
        }
开发者ID:zdimension,项目名称:FreeRaider,代码行数:21,代码来源:Render.cs

示例5: RenderSkeletalModel

        public void RenderSkeletalModel(LitShaderDescription shader, SSBoneFrame bframe, Matrix4 mvMatrix,
            Matrix4 mvpMatrix)
        {
            foreach (var btag in bframe.BoneTags)
            {
                var mvTransform = mvMatrix.MultiplyByTransform(btag.FullTransform);
                GL.UniformMatrix4(shader.ModelView, false, ref mvTransform);

                var mvpTransform = mvpMatrix.MultiplyByTransform(btag.FullTransform);
                GL.UniformMatrix4(shader.ModelViewProjection, false, ref mvpTransform);

                RenderMesh(btag.MeshBase);
                if (btag.MeshSlot != null)
                {
                    RenderMesh(btag.MeshSlot);
                }
            }
        }
开发者ID:zdimension,项目名称:FreeRaider,代码行数:18,代码来源:Render.cs


注:本文中的Matrix4.MultiplyByTransform方法示例由纯净天空整理自Github/MSDocs等开源代码及文档管理平台,相关代码片段筛选自各路编程大神贡献的开源项目,源码版权归原作者所有,传播和使用请参考对应项目的License;未经允许,请勿转载。