protected override void PrepareCore(RenderContext context, RenderItemCollection opaqueList, RenderItemCollection transparentList) { var cameraState = context.GetCurrentCamera(); if (cameraState == null) return; UpdateParameters(context, cameraState); }
private void PrepareModels(RenderContext context, List <RenderModel> renderModels, RenderItemCollection opaqueList, RenderItemCollection transparentList) { // If no camera, early exit var camera = context.GetCurrentCamera(); if (camera == null) { return; } var viewProjectionMatrix = camera.ViewProjectionMatrix; var preRenderModel = Callbacks.PreRenderModel; foreach (var renderModel in renderModels) { // If Model is null, then skip it if (renderModel.Model == null) { continue; } if (preRenderModel != null) { if (!preRenderModel(context, renderModel)) { continue; } } // Always prepare the slot for the render meshes even if they are not used. EnsureRenderMeshes(renderModel); var meshes = PrepareModelForRendering(context, renderModel); foreach (var renderMesh in meshes) { if (!renderMesh.Enabled) { continue; } // Project the position // TODO: This could be done in a SIMD batch, but we need to figure-out how to plugin in with RenderMesh object var worldPosition = new Vector4(renderMesh.Parameters.Get(TransformationKeys.World).TranslationVector, 1.0f); Vector4 projectedPosition; Vector4.Transform(ref worldPosition, ref viewProjectionMatrix, out projectedPosition); var projectedZ = projectedPosition.Z / projectedPosition.W; renderMesh.UpdateMaterial(); var list = renderMesh.HasTransparency ? transparentList : opaqueList; list.Add(new RenderItem(this, renderMesh, projectedZ)); } } }
protected override void PrepareCore(RenderContext context, RenderItemCollection opaqueList, RenderItemCollection transparentList) { spriteProcessor = SceneInstance.GetProcessor <SpriteProcessor>(); if (spriteProcessor == null) { return; } // If no camera, early exit var camera = context.GetCurrentCamera(); if (camera == null) { return; } var viewProjectionMatrix = camera.ViewProjectionMatrix; foreach (var spriteState in spriteProcessor.Sprites) { var sprite = spriteState.SpriteComponent.CurrentSprite; if (sprite == null) { continue; } // Perform culling on group and accept if (!CurrentCullingMask.Contains(spriteState.SpriteComponent.Entity.Group)) { continue; } // Project the position // TODO: This could be done in a SIMD batch, but we need to figure-out how to plugin in with RenderMesh object var worldPosition = new Vector4(spriteState.TransformComponent.WorldMatrix.TranslationVector, 1.0f); Vector4 projectedPosition; Vector4.Transform(ref worldPosition, ref viewProjectionMatrix, out projectedPosition); var projectedZ = projectedPosition.Z / projectedPosition.W; var list = sprite.IsTransparent ? transparentList : opaqueList; list.Add(new RenderItem(this, spriteState, projectedZ)); } }
protected override void PrepareCore(RenderContext context, RenderItemCollection opaqueList, RenderItemCollection transparentList) { // If no camera, early exit var camera = context.GetCurrentCamera(); if (camera == null) { return; } // Copy the ViewProjectionMatrix from the camera as it is not automatically picked up by the ModelComponentRenderer modelRenderer.ViewProjectionMatrix = camera.ViewProjectionMatrix; var sceneCameraRenderer = context.Tags.Get(SceneCameraRenderer.Current); var cameraRenderMode = sceneCameraRenderer != null ? sceneCameraRenderer.Mode : null; if (cameraRenderMode != null) { modelRenderer.RasterizerState = cameraRenderMode.GetDefaultRasterizerState(false); modelRenderer.RasterizerStateForInvertedGeometry = cameraRenderMode.GetDefaultRasterizerState(true); } modelRenderer.Prepare(context, opaqueList, transparentList); }
private void PrepareModels(RenderContext context, List <RenderModel> renderModels, RenderItemCollection opaqueList, RenderItemCollection transparentList) { // If no camera, early exit var camera = context.GetCurrentCamera(); if (camera == null) { return; } var viewProjectionMatrix = camera.ViewProjectionMatrix; var preRenderModel = Callbacks.PreRenderModel; var sceneCameraRenderer = context.Tags.Get(SceneCameraRenderer.Current); var cullingMode = CullingModeOverride.HasValue ? CullingModeOverride.Value : sceneCameraRenderer != null ? sceneCameraRenderer.CullingMode : CullingMode.None; var frustum = new BoundingFrustum(ref viewProjectionMatrix); var cameraRenderMode = sceneCameraRenderer != null ? sceneCameraRenderer.Mode : null; foreach (var renderModel in renderModels) { // If Model is null, then skip it if (renderModel.Model == null) { continue; } if (preRenderModel != null) { if (!preRenderModel(context, renderModel)) { continue; } } // Always prepare the slot for the render meshes even if they are not used. EnsureRenderMeshes(renderModel); var meshes = PrepareModelForRendering(context, renderModel); foreach (var renderMesh in meshes) { if (!renderMesh.Enabled) { continue; } // Perform frustum culling if (cullingMode == CullingMode.Frustum) { // Always render meshes with unspecified bounds // TODO: This should not be necessary. Add proper bounding boxes to gizmos etc. if (renderMesh.BoundingBox.Extent != Vector3.Zero) { // Fast AABB transform: http://zeuxcg.org/2010/10/17/aabb-from-obb-with-component-wise-abs/ // Compute transformed AABB (by world) if (!frustum.Contains(ref renderMesh.BoundingBox)) { continue; } } } // Project the position // TODO: This could be done in a SIMD batch, but we need to figure-out how to plugin in with RenderMesh object var worldPosition = new Vector4(renderMesh.WorldMatrix.TranslationVector, 1.0f); Vector4 projectedPosition; Vector4.Transform(ref worldPosition, ref viewProjectionMatrix, out projectedPosition); var projectedZ = projectedPosition.Z / projectedPosition.W; // TODO: Should this be set somewhere else? var rasterizerState = cameraRenderMode != null?cameraRenderMode.GetDefaultRasterizerState(renderMesh.IsGeometryInverted) : null; renderMesh.RasterizerState = RasterizerState ?? rasterizerState; renderMesh.UpdateMaterial(); var list = renderMesh.HasTransparency ? transparentList : opaqueList; list.Add(new RenderItem(this, renderMesh, projectedZ)); } } }