// Sets up this effect and selects a technique to render with. protected override string _SetupEffect(SceneRenderState srs, MaterialInstanceData materialData) { // For now, we'll accept whatever SimpleMaterial would use. base._SetupEffect(srs, materialData); return "Technique1"; }
/// <summary> /// Updates all the reflections based on their priority. /// </summary> /// <param name="srs">The current scene render state.</param> public void Update(SceneRenderState srs) { if (_reflectionList.Count == 0) return; #if DEBUG Profiler.Instance.StartBlock(_updateProfileBlock); #endif _frameCounter++; // is this an odd or even numbered frame? evenFrame = _frameCounter % 2 == 0; // always update priority 0 updated = _Update(0, srs); // on even frames, update priority 2 if (evenFrame) updated = _Update(2, srs); // on odd frames or if no 2s were updated, update priority 1 if (!evenFrame || !updated) updated = _Update(1, srs); // not sure why we need to clear depth, but if we don't, messed up things happen srs.Gfx.Device.Clear(ClearOptions.DepthBuffer, Color.White, 1.0f, 0); #if DEBUG Profiler.Instance.EndBlock(_updateProfileBlock); #endif }
protected override void _SetupGlobalParameters(SceneRenderState srs, MaterialInstanceData materialData) { Assert.Fatal(_texture != null, "PostProcessMaterial._SetupGlobalParameters - Texture has not been set!"); base._SetupGlobalParameters(srs, materialData); _baseTextureParameter.SetValue(_texture); }
public override void Render(int frame, int matFrame, Material[] materialList, SceneRenderState srs) { Vector3 cameraCenter = srs.CameraPosition; DrawPrimitive.Set(_vb.Instance, _ib.Instance, _verts.Length, 0, GFXVertexFormat.VertexSize, GFXVertexFormat.GetVertexDeclaration(srs.Gfx.Device)); int nextCluster = _startCluster; do { // Render the cluster... for (int i = _clusters[nextCluster].StartPrimitive; i < _clusters[nextCluster].EndPrimitive; i++) { DrawPrimitive.SetMaterial(_primitives[i].MaterialIndex & DrawPrimitive.MaterialMask, materialList, ref _bounds, srs); DrawPrimitive.Render(_primitives[i].MaterialIndex & DrawPrimitive.TypeMask, _primitives[i].Start, _primitives[i].NumElements); } // determine Next cluster... if (_clusters[nextCluster].FrontCluster != _clusters[nextCluster].BackCluster) { float dot = _clusters[nextCluster].Normal.X * cameraCenter.X + _clusters[nextCluster].Normal.Y * cameraCenter.Y + _clusters[nextCluster].Normal.Z * cameraCenter.Z; // this is opposite of TGE (i.e., -dot rather than dot). nextCluster = (-dot > _clusters[nextCluster].K) ? _clusters[nextCluster].FrontCluster : _clusters[nextCluster].BackCluster; } else { nextCluster = _clusters[nextCluster].FrontCluster; } } while (nextCluster >= 0); DrawPrimitive.Clear(); }
protected override string _SetupEffect(SceneRenderState srs, MaterialInstanceData materialData) { if (_blendAmount < 1.0f) { srs.Gfx.Device.RenderState.AlphaBlendEnable = true; srs.Gfx.Device.RenderState.SourceBlend = Blend.SourceAlpha; srs.Gfx.Device.RenderState.DestinationBlend = Blend.InverseSourceAlpha; } return "CopyTechnique"; }
protected override void _SetupObjectParameters(RenderInstance renderInstance, SceneRenderState srs) { base._SetupObjectParameters(renderInstance, srs); EffectManager.SetParameter(_worldViewProjectionParameter, renderInstance.ObjectTransform * srs.View * srs.Projection); EffectManager.SetParameter(_opacityParameter, renderInstance.Opacity); ITextureMaterial material = renderInstance.Material as ITextureMaterial; if (material != null && !material.Texture.IsNull) EffectManager.SetParameter(_baseTextureParameter, material.Texture.Instance); }
public override void RenderTranslucentPass(SceneRenderState srs) { #if DEBUG Profiler.Instance.StartBlock(_renderProfileBlock); #endif base.RenderOpaquePass(srs); base.RenderTranslucentPass(srs); #if DEBUG Profiler.Instance.EndBlock(_renderProfileBlock); #endif }
public override void Sort(SceneRenderState srs) { #if DEBUG Profiler.Instance.StartBlock(_sortProfileBlock); #endif if (srs.SceneGraph is T2DSceneGraph) _elementList.Sort(_2DComparer); #if DEBUG Profiler.Instance.EndBlock(_sortProfileBlock); #endif }
protected override void _SetupObjectParameters(RenderInstance renderInstance, SceneRenderState srs) { base._SetupObjectParameters(renderInstance, srs); BasicEffect basicEffect = _effect.Instance as BasicEffect; if (basicEffect != null) basicEffect.World = renderInstance.ObjectTransform; else { EffectParameter worldParam = _effect.Instance.Parameters["World"]; worldParam.SetValue(srs.World.Top); } }
public override void RenderTranslucentPass(SceneRenderState srs) { // Make sure we have something to render. if (_elementList.Count == 0 || srs.IsReflectPass || GFXDevice.Instance.ShaderProfile < ShaderProfile.PS_1_4) return; // Get the current render target which contains the state // of the scene rendered so far. RenderTarget2D sceneTarget = GFXDevice.Instance.Device.GetRenderTarget(0) as RenderTarget2D; if (sceneTarget == null) return; #if DEBUG Profiler.Instance.StartBlock(_renderProfileBlock); #endif // So here we're making a copy of the current state of the // active scene render target for use in the refraction effect. // Prepare the copy material if we don't have one. if (_copyMaterial == null) { _copyMaterial = new SimpleMaterial(); _copyMaterial.IsCopyPass = true; } // Copy the content of the current scene render target to // the refraction texture. GFXDevice.Instance.Device.SetRenderTarget(0, null); _refractionTexture = sceneTarget.GetTexture(); // Now set back the scene render target. // // At this point the act of switching render targets has // forced the content to be lost. To fix that we do a // copy to get the original content back. // _copyMaterial.SetTexture(_refractionTexture); TorqueEngineComponent.Instance.ReapplyMainRenderTarget(); SceneRenderer.RenderManager.RenderQuad(_copyMaterial, Vector2.Zero, new Vector2(sceneTarget.Width, sceneTarget.Height)); // Now render all the refraction meshes. base.RenderOpaquePass(srs); #if DEBUG Profiler.Instance.EndBlock(_renderProfileBlock); #endif }
protected override void _SetupGlobalParameters(SceneRenderState srs, MaterialInstanceData materialData) { base._SetupGlobalParameters(srs, materialData); BasicEffect basicEffect = _effect.Instance as BasicEffect; if (basicEffect != null) { basicEffect.EnableDefaultLighting(); basicEffect.View = srs.View; basicEffect.Projection = srs.Projection; } else { EffectParameter viewParam = _effect.Instance.Parameters["View"]; viewParam.SetValue(srs.View); EffectParameter projectionParam = _effect.Instance.Parameters["Projection"]; projectionParam.SetValue(srs.Projection); } }
public override void RenderOpaquePass(SceneRenderState srs) { if (_elementList.Count == 0 || srs.IsReflectPass) return; T2DSceneGraph sceneGraph = srs.SceneGraph as T2DSceneGraph; Assert.Fatal(sceneGraph != null, "T2DRenderManager.RenderOpaquePass - 2D elements should not be added to a 3D scenegraph!"); // always use alpha blending srs.Gfx.Device.RenderState.AlphaBlendEnable = true; // if the depth buffer isn't being used, disable it if (!sceneGraph.UseDepthBuffer) srs.Gfx.Device.RenderState.DepthBufferEnable = false; // The depth buffer is enabled, but not in a z pass, so we need alpha testing to keep transparent // parts of textures out of the z buffer. else if (!sceneGraph.DoZPass) { srs.Gfx.Device.RenderState.AlphaTestEnable = true; srs.Gfx.Device.RenderState.ReferenceAlpha = 255; } // render objects as normal _RenderDiffuse(srs, srs.Gfx.Device); // in case a 3D object was the last thing rendered if (_rendering3D) _Cleanup3DState(srs, srs.Gfx.Device); // cleanup render states if (!sceneGraph.UseDepthBuffer) srs.Gfx.Device.RenderState.DepthBufferEnable = true; else if (!sceneGraph.DoZPass) srs.Gfx.Device.RenderState.AlphaTestEnable = false; srs.Gfx.Device.RenderState.AlphaBlendEnable = false; }
protected override string _SetupEffect(SceneRenderState srs, MaterialInstanceData materialData) { srs.Gfx.Device.RenderState.DestinationBlend = Blend.InverseSourceAlpha; srs.Gfx.Device.RenderState.SourceBlend = Blend.SourceAlpha; return base._SetupEffect(srs, materialData); }
public override void RenderOpaquePass(SceneRenderState srs) { }
protected override void _RenderGroup(List<RenderInstance> renderInstances, RenderMaterial material, MaterialInstanceData materialData, SceneRenderState srs, GraphicsDevice d3d) { (material as IRefractionMaterial).SetTexture(_refractionTexture); base._RenderGroup(renderInstances, material, materialData, srs, d3d); }
public override void RenderZPass(SceneRenderState srs) { }
void _RenderMesh(ref ObjectInstance obj, int objectDetail, Material[] materialList, SceneRenderState srs) { if (obj.Visibility > 0.01f) { mesh = _GetMesh(ref obj.Object, objectDetail); if (mesh != null) { srs.World.Push(); if (obj.Object.NodeIndex >= 0) srs.World.MultiplyMatrixLocal(_nodeTransforms[obj.Object.NodeIndex]); mesh.Render(obj.Frame, obj.MaterialFrame, materialList, srs); srs.World.Pop(); } } }
/// <summary> /// Select a detail level given the specified scene render state. /// </summary> /// <param name="srs">The scene render state to base detail level selection on.</param> /// <returns>The detail level to use.</returns> public int SelectCurrentDetail(SceneRenderState srs) { if (_shape.DetailLevelCount == 1) { _currentDetailLevel = 0; return 0; } Matrix world = srs.World.Top; Vector3 p; Vector3.Transform(ref _shape.Center, ref world, out p); p -= srs.CameraPosition; float dist = p.LengthSquared(); ; x = world.Left; y = world.Forward; z = world.Up; float scale = x.LengthSquared(); scale += y.LengthSquared(); scale += z.LengthSquared(); scale *= 0.3334f; dist /= scale; dist = (float)Math.Sqrt(dist); float pixelRadius = srs.Gfx.ProjectRadius(dist, _shape.Radius); return SelectCurrentDetail(pixelRadius); }
/// <summary> /// Renders the shape. /// </summary> /// <param name="dl">The detail level to render at.</param> /// <param name="intraDL">Unused</param> /// <param name="objectScale">Unused</param> /// <param name="srs">The current render state of the scene.</param> /// <param name="hidden">Bitmask of the mesh indices that should not be rendered.</param> public void Render(int dl, float intraDL, Vector3 objectScale, SceneRenderState srs, int hidden) { // if dl==-1, nothing to do if (dl == -1) return; Assert.Fatal(dl >= 0 && dl < _shape.DetailLevelCount, "ShapeInstance.render - Invalid detail level."); ss = _shape.Details[dl].SubShapeNumber; od = _shape.Details[dl].ObjectDetailNumber; if (ss < 0) return; // Set up static data _SetStatics(dl, intraDL, objectScale); _shape.CreateVBIB(srs.Gfx.Device); // Set up animating ifl materials for (int i = 0; i < _iflMaterialInstances.Length; i++) _materialList[_iflMaterialInstances[i].IflMaterial.MaterialSlot] = _materialList[_iflMaterialInstances[i].IflMaterial.FirstFrame + _iflMaterialInstances[i].Frame]; // run through the meshes start = !_renderNonTranslucent ? _shape.SubShapeFirstTranslucentObject[ss] : _shape.SubShapeFirstObject[ss]; end = !_renderTranslucent ? _shape.SubShapeFirstTranslucentObject[ss] : _shape.SubShapeFirstObject[ss] + _shape.SubShapeObjectCount[ss]; for (int i = start; i < end; i++) { if ((1 << i & hidden) > 0) continue; _RenderMesh(ref _meshObjects[i], od, _materialList, srs); } _ClearStatics(); }
protected void _InitDynamic(int size, CubemapCamera camera) { if (!_cubeTexture.IsNull) return; _camera = camera; _sceneRenderState = new SceneRenderState(); _renderTarget = ResourceManager.Instance.CreateRenderTargetCube(size); // resolve faces of cube texture for the xbox for (int i = 0; i < 6; ++i) { GFXDevice.Instance.Device.SetRenderTarget(0, _renderTarget.Instance, (CubeMapFace)i); } // reset render target TorqueEngineComponent.Instance.ReapplyMainRenderTarget(); _cubeTexture = ResourceManager.Instance.CreateTextureCube(_renderTarget); }
protected override void _SetupGlobalParameters(SceneRenderState srs, MaterialInstanceData materialData) { base._SetupGlobalParameters(srs, materialData); if (!_texture.IsNull) EffectManager.SetParameter(_baseTextureParameter, CurrentVideoFrameTexture.Instance); }
protected override string _SetupEffect(SceneRenderState srs, MaterialInstanceData materialData) { if (!_textureMissing && (_texture.IsNull || _texture.IsInvalid) && !string.IsNullOrEmpty(_textureFilename)) { _texture = ResourceManager.Instance.LoadTexture(_textureFilename); if (_texture.IsNull) _textureMissing = true; } if (_isCopyPass) return "CopyTechnique"; if (!_texture.IsNull) { if (_isColorBlended) return "ColorTextureBlendTechnique"; return "TexturedTechnique"; } return "ColoredTechnique"; }
protected override void _SetupGlobalParameters(SceneRenderState srs, MaterialInstanceData materialData) { base._SetupGlobalParameters(srs, materialData); EffectManager.SetParameter(_opacityParameter, _blendAmount); EffectManager.SetParameter(_worldViewProjectionParameter, Matrix.Identity); }
public override void Render(SceneRenderState srs) { GraphicsDevice d3d = srs.Gfx.Device; Assert.Fatal(d3d != null, "doh"); if (_vertices == null) return; if (_vb.IsNull) _CreateVB(); if (_refillVB) _FillVB(); if (_polyDirty) _UpdateCollisionPoly(); Vector3 ScaleVector = new Vector3(0.5f * Size.X, 0.5f * Size.Y, 1); // scale, translate, rotate Matrix ScaleMatrix = Matrix.CreateScale(ScaleVector); Matrix TranslationMatrix = Matrix.CreateTranslation(new Vector3(Position.X, Position.Y, LayerDepth)); Matrix RotationMatrix = Matrix.CreateRotationZ(MathHelper.ToRadians(Rotation)); Matrix objToWorld = ScaleMatrix * RotationMatrix * TranslationMatrix; int numVerts = _vertices.Length + 1; srs.World.Push(); srs.World.MultiplyMatrixLocal(objToWorld); RenderInstance ri = SceneRenderer.RenderManager.AllocateInstance(); ri.Type = RenderInstance.RenderInstanceType.Mesh2D; ri.ObjectTransform = srs.World.Top; ri.VertexBuffer = _vb.Instance; ri.PrimitiveType = PrimitiveType.LineStrip; ri.VertexSize = GFXVertexFormat.VertexSize; ri.VertexDeclaration = GFXVertexFormat.GetVertexDeclaration(d3d); ri.VertexCount = numVerts; ri.BaseVertex = 0; ri.PrimitiveCount = numVerts - 1; ri.Opacity = VisibilityLevel; ri.UTextureAddressMode = TextureAddressMode.Clamp; ri.VTextureAddressMode = TextureAddressMode.Clamp; ri.Material = _material; SceneRenderer.RenderManager.AddInstance(ri); srs.World.Pop(); base.Render(srs); }
protected override void _SetupGlobalParameters(SceneRenderState srs, MaterialInstanceData materialData) { base._SetupGlobalParameters(srs, materialData); if (_texture.Instance != null && _texture.Instance.IsDisposed) _texture.Invalidate(); if (!_texture.IsNull) EffectManager.SetParameter(_baseTextureParameter, Texture.Instance); }
protected override void _SetupGlobalParameters(SceneRenderState srs, MaterialInstanceData materialData) { base._SetupGlobalParameters(srs, materialData); EffectManager.SetParameter(_fogColorParameter, _fogColor); EffectManager.SetParameter(_fogNearDistanceParameter, _fogNearDistance); EffectManager.SetParameter(_fogFarDistanceParameter, _fogFarDistance); EffectManager.SetParameter(_camPosParameter, srs.CameraPosition); }
protected override string _SetupEffect(SceneRenderState srs, MaterialInstanceData materialData) { if ((_texture.IsNull || _texture.IsInvalid) && !string.IsNullOrEmpty(VideoFilename)) _texture = ResourceManager.Instance.CreateResource<Texture2D>(_videoPlayer.GetTexture()); if (_isCopyPass) return "CopyTechnique"; if (!_texture.IsNull) { if (_isColorBlended) return "ColorTextureBlendTechnique"; return "TexturedTechnique"; } return "ColoredTechnique"; }
protected override void _SetupObjectParameters(RenderInstance renderInstance, SceneRenderState srs) { base._SetupObjectParameters(renderInstance, srs); EffectManager.SetParameter(_worldMatrixParameter, renderInstance.ObjectTransform); EffectManager.SetParameter(_worldViewProjectionParameter, renderInstance.ObjectTransform * srs.View * srs.Projection); }
protected override void _SetupObjectParameters(RenderInstance renderInstance, SceneRenderState srs) { base._SetupObjectParameters(renderInstance, srs); EffectManager.SetParameter(_worldViewProjectionParameter, renderInstance.ObjectTransform * srs.View * srs.Projection); if (IsTranslucent) EffectManager.SetParameter(_opacityParameter, renderInstance.Opacity * _opacity); }
public override void Render(SceneRenderState srs) { #if DEBUG Profiler.Instance.StartBlock("T2DParticleEffect.Render"); #endif // Any effect-data? if (CurrentEffectData == null) { // No, so finish here. #if DEBUG Profiler.Instance.EndBlock("T2DParticleEffect.Render"); #endif return; } // Any particle allocations? if (_currentParticleAllocations == 0) { // No, so finish here. #if DEBUG Profiler.Instance.EndBlock("T2DParticleEffect.Render"); #endif return; } // Update Render Batch. _UpdateRenderBatch(); // Fetch Graphics Device. GraphicsDevice d3d = srs.Gfx.Device; // Sanity! Assert.Fatal(d3d != null, "Could not acquire graphics device!"); // MM: This'll do for now! _tangent = new Vector4(MatrixUtil.MatrixGetRow(0, ref srs._camTrans), 1.0f); _normal = new Vector4(MatrixUtil.MatrixGetRow(2, ref srs._camTrans), 0.0f); // Calculate Vertex Count. int vertexCount = _currentParticleAllocations * 4; // Create Scratch Vertex Array. GFXVertexFormat.PCTTBN[] _vertexScratch = TorqueUtil.GetScratchArray<GFXVertexFormat.PCTTBN>(vertexCount); // Sanity! Assert.Fatal(_vertexScratch != null, "Invalid vertex scratch!"); int vertexOffset = 0; // Enumerate Emitters. foreach (T2DParticleEmitter emitter in _emitterList) { // Is emitter showing and has some particles allocated? if (!emitter.CurrentEmitterData.Hidden && emitter.Allocated > 0) { _textureCoords = emitter.CurrentEmitterData.TextureCoords; // Create Render Instance. RenderInstance ri = SceneRenderer.RenderManager.AllocateInstance(); ri.Type = RenderInstance.RenderInstanceType.Mesh2D; // Sanity! Assert.Fatal(_vertexScratch != null, "Invalid vertex scratch!"); // Populate Render Instance. ri.ObjectTransform = emitter.ParticleRenderTransform; ri.VertexBuffer = _vertexBuffer.Instance; ri.IndexBuffer = _indexBuffer.Instance; ri.BaseVertex = vertexOffset; ri.StartIndex = 0; ri.PrimitiveType = PrimitiveType.TriangleList; ri.PrimitiveCount = emitter.Allocated * 2; ri.VertexCount = emitter.Allocated * 4; ri.VertexSize = GFXVertexFormat.VertexSize; ri.VertexDeclaration = GFXVertexFormat.GetVertexDeclaration(GFXDevice.Instance.Device); ri.Opacity = VisibilityLevel; ri.UTextureAddressMode = TextureAddressMode.Clamp; ri.VTextureAddressMode = TextureAddressMode.Clamp; ri.Material = emitter.CurrentEmitterData.Material; // Render Emitter. emitter.RenderEmitter(_vertexScratch, ref vertexOffset, _textureCoords, ref _normal, ref _tangent); // Add Render Instance to Render Manager. SceneRenderer.RenderManager.AddInstance(ri); } } // Sanity! Assert.Fatal(vertexOffset <= vertexCount, "Vertex Count Mismatch rendering effect!"); // NOTE:- It's important to note that the vertex offsets may not realize the vertex // counts as emitters can be hidden and therefore won't contribute to the offset // into the vertex buffers. // // JMQ: except that if you pass a zero vertexOffset into the SetData function, it // will throw an exception. Added a check for that. // if (vertexCount != 0 && vertexOffset > 0) { GFXDevice.Instance.Device.Vertices[0].SetSource(null, 0, 0); #if XBOX _vertexBuffer.Instance.SetData<GFXVertexFormat.PCTTBN>(_vertexScratch, 0, vertexOffset); #else _vertexBuffer.Instance.SetData<GFXVertexFormat.PCTTBN>(_vertexScratch, 0, vertexOffset, SetDataOptions.Discard); #endif } _vertexScratch = null; // Base Render. base.Render(srs); #if DEBUG Profiler.Instance.EndBlock("T2DParticleEffect.Render"); #endif }