GetCameraPosition4() public method

Returns camera position as Vector4
public GetCameraPosition4 ( StereoEye stereoEye ) : System.Vector4
stereoEye StereoEye
return System.Vector4
Exemplo n.º 1
0
		/// <summary>
		/// 
		/// </summary>
		/// <param name="camera"></param>
		/// <param name="depthBuffer"></param>
		/// <param name="hdrTarget"></param>
		/// <param name="diffuse"></param>
		/// <param name="specular"></param>
		/// <param name="normals"></param>
		internal void RenderGBuffer ( StereoEye stereoEye, Camera camera, HdrFrame frame, RenderWorld viewLayer )
		{		
			using ( new PixEvent("RenderGBuffer") ) {
				if (surfaceShader==null) {	
					return;
				}

				if (rs.SkipSceneRendering) {
					return;
				}

				var device		=	Game.GraphicsDevice;

				var view			=	camera.GetViewMatrix( stereoEye );
				var projection		=	camera.GetProjectionMatrix( stereoEye );
				var viewPosition	=	camera.GetCameraPosition4( stereoEye );

				var cbData		=	new CBMeshInstanceData();

				var hdr			=	frame.HdrBuffer.Surface;
				var depth		=	frame.DepthBuffer.Surface;
				var diffuse		=	frame.DiffuseBuffer.Surface;
				var specular	=	frame.SpecularBuffer.Surface;
				var normals		=	frame.NormalMapBuffer.Surface;
				var scattering	=	frame.ScatteringBuffer.Surface;

				device.ResetStates();

				device.SetTargets( depth, hdr, diffuse, specular, normals, scattering );
				device.PixelShaderSamplers[0]	= SamplerState.AnisotropicWrap ;

				var instances	=	viewLayer.Instances;

				//#warning INSTANSING!
				foreach ( var instance in instances ) {

					if (!instance.Visible) {
						continue;
					}

					cbData.View			=	view;
					cbData.Projection	=	projection;
					cbData.World		=	instance.World;
					cbData.ViewPos		=	viewPosition;
					
					constBuffer.SetData( cbData );

					device.PixelShaderConstants[0]	= constBuffer ;
					device.VertexShaderConstants[0]	= constBuffer ;

					device.SetupVertexInput( instance.vb, instance.ib );

					if (instance.IsSkinned) {
						constBufferBones.SetData( instance.BoneTransforms );
						device.VertexShaderConstants[3]	= constBufferBones ;
					}

					try {

						foreach ( var sg in instance.ShadingGroups ) {

							device.PipelineState	=	instance.IsSkinned ? sg.Material.GBufferSkinned : sg.Material.GBufferRigid;

							device.PixelShaderConstants[1]	= sg.Material.ConstantBufferParameters;
							device.PixelShaderConstants[2]	= sg.Material.ConstantBufferUVModifiers;
							device.VertexShaderConstants[1]	= sg.Material.ConstantBufferParameters;
							device.VertexShaderConstants[2]	= sg.Material.ConstantBufferUVModifiers;

							sg.Material.SetTextures( device );

							device.DrawIndexed( sg.IndicesCount, sg.StartIndex, 0 );

							rs.Counters.SceneDIPs++;
						}
					} catch ( UbershaderException e ) {
						Log.Warning( e.Message );					
						ExceptionDialog.Show( e );
					}
				}
			}
		}
Exemplo n.º 2
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="camera"></param>
        /// <param name="depthBuffer"></param>
        /// <param name="hdrTarget"></param>
        /// <param name="diffuse"></param>
        /// <param name="specular"></param>
        /// <param name="normals"></param>
        internal void RenderGBuffer(GameTime gameTime, StereoEye stereoEye, Camera camera, HdrFrame frame, RenderWorld rw, bool staticOnly)
        {
            using (new PixEvent("RenderGBuffer")) {
                if (surfaceShader == null)
                {
                    return;
                }

                if (rs.SkipSceneRendering)
                {
                    return;
                }

                var device = Game.GraphicsDevice;

                var view         = camera.GetViewMatrix(stereoEye);
                var projection   = camera.GetProjectionMatrix(stereoEye);
                var viewPosition = camera.GetCameraPosition4(stereoEye);

                var cbData       = new CBMeshInstanceData();
                var cbDataSubset = new CBSubsetData();

                var hdr      = frame.HdrBuffer.Surface;
                var depth    = frame.DepthBuffer.Surface;
                var gbuffer0 = frame.GBuffer0.Surface;
                var gbuffer1 = frame.GBuffer1.Surface;
                var feedback = frame.FeedbackBuffer.Surface;

                device.ResetStates();

                device.SetTargets(depth, hdr, gbuffer0, gbuffer1, feedback);
                device.PixelShaderSamplers[0] = SamplerState.LinearPointClamp;
                device.PixelShaderSamplers[1] = SamplerState.PointClamp;
                device.PixelShaderSamplers[2] = SamplerState.AnisotropicClamp;

                var instances = rw.Instances;

                if (instances.Any())
                {
                    device.PixelShaderResources[1] = rs.VTSystem.PageTable;
                    device.PixelShaderResources[2] = rs.VTSystem.PhysicalPages0;
                    device.PixelShaderResources[3] = rs.VTSystem.PhysicalPages1;
                    device.PixelShaderResources[4] = rs.VTSystem.PhysicalPages2;
                }

                //#warning INSTANSING!
                foreach (var instance in instances)
                {
                    if (!instance.Visible)
                    {
                        continue;
                    }

                    if (staticOnly && !instance.Static)
                    {
                        continue;
                    }

                    cbData.View           = view;
                    cbData.Projection     = projection;
                    cbData.World          = instance.World;
                    cbData.ViewPos        = viewPosition;
                    cbData.Color          = instance.Color;
                    cbData.ViewBounds     = new Vector4(hdr.Width, hdr.Height, hdr.Width, hdr.Height);
                    cbData.VTPageScaleRCP = rs.VTSystem.PageScaleRCP;

                    constBuffer.SetData(cbData);

                    device.PixelShaderConstants[0]  = constBuffer;
                    device.VertexShaderConstants[0] = constBuffer;
                    device.PixelShaderConstants[1]  = constBufferSubset;

                    device.SetupVertexInput(instance.vb, instance.ib);

                    if (instance.IsSkinned)
                    {
                        constBufferBones.SetData(instance.BoneTransforms);
                        device.VertexShaderConstants[3] = constBufferBones;
                    }

                    try {
                        device.PipelineState = factory[(int)(SurfaceFlags.GBUFFER | SurfaceFlags.RIGID)];


                        foreach (var subset in instance.Subsets)
                        {
                            var vt   = rw.VirtualTexture;
                            var rect = vt.GetTexturePosition(subset.Name);

                            cbDataSubset.Rectangle = new Vector4(rect.X, rect.Y, rect.Width, rect.Height);

                            constBufferSubset.SetData(cbDataSubset);
                            device.PixelShaderConstants[1] = constBufferSubset;

                            device.DrawIndexed(subset.PrimitiveCount * 3, subset.StartPrimitive * 3, 0);
                        }

                        rs.Counters.SceneDIPs++;
                    } catch (UbershaderException e) {
                        Log.Warning(e.Message);
                        ExceptionDialog.Show(e);
                    }
                }


                //
                //	downsample feedback buffer and readback it to virtual texture :
                //
                rs.Filter.StretchRect(frame.FeedbackBufferRB.Surface, frame.FeedbackBuffer, SamplerState.PointClamp);

                var feedbackBuffer = new VTAddress[HdrFrame.FeedbackBufferWidth * HdrFrame.FeedbackBufferHeight];
                frame.FeedbackBufferRB.GetFeedback(feedbackBuffer);
                rs.VTSystem.Update(feedbackBuffer, gameTime);
            }
        }
Exemplo n.º 3
0
        /// <summary>
        ///
        /// </summary>
        internal void Render(RenderTargetSurface colorBuffer, DepthStencilSurface depthBuffer, Camera camera)
        {
            DrawTracers();

            if (!vertexDataAccum.Any())
            {
                return;
            }

            if (Game.RenderSystem.SkipDebugRendering)
            {
                vertexDataAccum.Clear();
                return;
            }

            var dev = Game.GraphicsDevice;

            dev.ResetStates();

            dev.SetTargets(depthBuffer, colorBuffer);


            var a = camera.GetProjectionMatrix(StereoEye.Mono).M11;
            var b = camera.GetProjectionMatrix(StereoEye.Mono).M22;
            var w = (float)colorBuffer.Width;
            var h = (float)colorBuffer.Height;

            constData.View         = camera.GetViewMatrix(StereoEye.Mono);
            constData.Projection   = camera.GetProjectionMatrix(StereoEye.Mono);
            constData.ViewPosition = camera.GetCameraPosition4(StereoEye.Mono);
            constData.PixelSize    = new Vector4(1 / w / a, 1 / b / h, 1 / w, 1 / h);
            constBuffer.SetData(constData);

            dev.SetupVertexInput(vertexBuffer, null);
            dev.VertexShaderConstants[0]   = constBuffer;
            dev.PixelShaderConstants[0]    = constBuffer;
            dev.GeometryShaderConstants[0] = constBuffer;

            var flags = new[] { RenderFlags.SOLID, RenderFlags.GHOST };


            foreach (var flag in flags)
            {
                dev.PipelineState = factory[(int)flag];

                int numDPs = MathUtil.IntDivUp(vertexDataAccum.Count, vertexBufferSize);

                for (int i = 0; i < numDPs; i++)
                {
                    int numVerts = i < numDPs - 1 ? vertexBufferSize : vertexDataAccum.Count % vertexBufferSize;

                    if (numVerts == 0)
                    {
                        break;
                    }

                    vertexDataAccum.CopyTo(i * vertexBufferSize, vertexArray, 0, numVerts);

                    vertexBuffer.SetData(vertexArray, 0, numVerts);

                    dev.Draw(numVerts, 0);
                }
            }

            vertexDataAccum.Clear();
        }