public void Draw( Texture2D texture, Vector3 Position, Vector2 size, Color4 color, Vector2 topleft, Vector2 topright, Vector2 bottomleft, Vector2 bottomright, float angle, int layer, BlendMode blend = BlendMode.Normal ) { rendat[billboardCount] = new RenderData( texture, blend, (ushort)vertexCountBasic ); CreateBillboard( Position, size, color, angle, topleft, topright, bottomleft, bottomright ); var z = RenderHelpers.GetZ(camera.Position, Position); buffer.AddCommand( this, rendat[billboardCount].GetHashCode(), billboardCount, layer, z ); billboardCount++; }
public void DrawTri( Texture2D texture, Vector3 Position, float radius, Color4 color, Vector2 texa, Vector2 texb, Vector2 texc, float angle, int layer, BlendMode blend = BlendMode.Normal ) { rendat[billboardCount] = RenderData.CreateTri( texture, blend, (ushort)vertexCountBasic ); CreateTriBillboard( Position, radius, color, angle, texa, texb, texc, camera.View.GetRight(), camera.View.GetUp() ); var z = RenderHelpers.GetZ(camera.Position, Position); buffer.AddCommand( this, rendat[billboardCount].GetHashCode(), billboardCount, layer, z ); billboardCount++; }
public void DrawCustomShader( Shader shader, ShaderAction setup, RenderUserData userData, Vector3 Position, Vector2 size, Color4 color, Vector2 topleft, Vector2 topright, Vector2 bottomleft, Vector2 bottomright, float angle, int layer, float z = float.NegativeInfinity ) { currentTexture = null; int vc = vertexCount; CreateBillboard( Position, size, color, angle, topleft, topright, bottomleft, bottomright ); buffer.AddCommand( this, shader, setup, userData, vc, layer, float.IsNegativeInfinity(z) ? RenderHelpers.GetZ(Matrix4.Identity, camera.Position, Position) : z ); }
public void Draw(CommandBuffer buffer, ICamera camera, Texture texture, Color4 color, Matrix4 world, bool inside) { var z = RenderHelpers.GetZ(world, camera.Position, Vector3.Zero); buffer.AddCommand( shader, shaderDelegate, resetDelegate, world, new RenderUserData() { Color = color, Camera = camera, Texture = texture }, vbo, PrimitiveTypes.TriangleList, 0, lastIndex, (currentIndex - lastIndex) / 3, true, inside ? SortLayers.NEBULA_INSIDE : SortLayers.NEBULA_NORMAL, z ); lastIndex = currentIndex; }
public override void Draw(ICamera camera, CommandBuffer commands, SystemLighting lights, NebulaRenderer nr) { if (sysr == null || vertices == null) { return; } float z = RenderHelpers.GetZ(Matrix4x4.Identity, camera.Position, pos); if (z > 900000) // Reduce artefacts from fast Z-sort calculation. This'll probably cause issues somewhere else { z = 900000; } var dist_scale = nr != null ? nr.Nebula.SunBurnthroughScale : 1; var alpha = nr != null ? nr.Nebula.SunBurnthroughIntensity : 1; if (radialShader == null) { radialShader = ShaderCache.Get("sun.vs", "sun_radial.frag"); radialTex0 = radialShader.Shader.GetLocation("tex0"); radialSize = radialShader.Shader.GetLocation("SizeMultiplier"); radialAlpha = radialShader.Shader.GetLocation("outerAlpha"); } if (spineShader == null) { spineShader = ShaderCache.Get("sun.vs", "sun_spine.frag"); spineTex0 = spineShader.Shader.GetLocation("tex0"); spineSize = spineShader.Shader.GetLocation("SizeMultiplier"); } radialShader.SetViewProjection(camera); radialShader.SetView(camera); spineShader.SetViewProjection(camera); spineShader.SetView(camera); int idx = sysr.StaticBillboards.DoVertices(ref ID, vertices); if (Sun.CenterSprite != null) { //draw center var cr = (Texture2D)sysr.ResourceManager.FindTexture(Sun.CenterSprite); commands.AddCommand(radialShader.Shader, RadialSetup, Cleanup, commands.WorldBuffer.Identity, new RenderUserData() { Float = 0, Color = new Color4(dist_scale, alpha, 0, 0), Texture = cr }, sysr.StaticBillboards.VertexBuffer, PrimitiveTypes.TriangleList, idx, 2, true, SortLayers.SUN, z); //next idx += 6; } //draw glow var gr = (Texture2D)sysr.ResourceManager.FindTexture(Sun.GlowSprite); commands.AddCommand(radialShader.Shader, RadialSetup, Cleanup, commands.WorldBuffer.Identity, new RenderUserData() { Float = 1, Color = new Color4(dist_scale, alpha, 0, 0), Texture = gr }, sysr.StaticBillboards.VertexBuffer, PrimitiveTypes.TriangleList, idx, 2, true, SortLayers.SUN, z + 108f); //next idx += 6; //draw spines if (Sun.SpinesSprite != null && nr == null) { var spinetex = (Texture2D)sysr.ResourceManager.FindTexture(Sun.SpinesSprite); commands.AddCommand(spineShader.Shader, SpineSetup, Cleanup, commands.WorldBuffer.Identity, new RenderUserData() { Texture = spinetex }, sysr.StaticBillboards.VertexBuffer, PrimitiveTypes.TriangleList, idx, 2 * Sun.Spines.Count, true, SortLayers.SUN, z + 1112f); } }
public void Draw(ResourceManager res, SystemLighting lighting, CommandBuffer buffer, NebulaRenderer nr) { //Null check if (_camera == null) { return; } //Asteroids! if (VectorMath.DistanceSquared(cameraPos, field.Zone.Position) <= renderDistSq) { float fadeNear = field.FillDist * 0.9f; float fadeFar = field.FillDist; if (field.Cube.Count > 0) { if (cubeCount == -1) { return; } for (int i = 0; i < cubeDrawCalls.Count; i++) { cubeDrawCalls[i].Material.Update(_camera); } var lt = RenderHelpers.ApplyLights(lighting, 0, cameraPos, field.FillDist, nr); while (!_asteroidsCalculated) { } for (int j = 0; j < cubeCount; j++) { var center = cubes[j].pos; var z = RenderHelpers.GetZ(cameraPos, center); for (int i = 0; i < cubeDrawCalls.Count; i++) { var dc = cubeDrawCalls[i]; if (VectorMath.DistanceSquared(center, cameraPos) < (fadeNear * fadeNear)) { //TODO: Accurately determine whether or not a cube has fading } buffer.AddCommandFade( dc.Material.Render, cubes[j].tr, lt, cube_vbo, PrimitiveTypes.TriangleList, dc.StartIndex, dc.Count / 3, SortLayers.OBJECT, new Vector2(fadeNear, fadeFar), z ); } } } if (field.BillboardCount != -1 || false) { var cameraLights = RenderHelpers.ApplyLights(lighting, 0, cameraPos, 1, nr); if (billboardTex == null || billboardTex.IsDisposed) { billboardTex = (Texture2D)res.FindTexture(field.BillboardShape.Texture); } for (int i = 0; i < astbillboards.Length; i++) { if (!astbillboards [i].Inited) { astbillboards [i].Spawn(this); } var d = VectorMath.DistanceSquared(cameraPos, astbillboards [i].Position); if (d < (field.BillboardDistance * field.BillboardDistance) || d > (field.FillDist * field.FillDist)) { astbillboards [i].Spawn(this); } if (astbillboards [i].Visible) { var alpha = 1f; var coords = billboardCoords [astbillboards [i].Texture]; sys.Game.Billboards.DrawTri( billboardTex, astbillboards [i].Position, astbillboards[i].Size, new Color4(field.BillboardTint * cameraLights.Ambient.Rgb, alpha), coords[0], coords[2], coords[1], 0, SortLayers.OBJECT ); } } } } //Band is last if (renderBand) { if (!_camera.Frustum.Intersects(new BoundingSphere(field.Zone.Position, lightingRadius))) { return; } var tex = (Texture2D)res.FindTexture(field.Band.Shape); for (int i = 0; i < SIDES; i++) { var p = bandCylinder.GetSidePosition(i); var zcoord = RenderHelpers.GetZ(bandTransform, cameraPos, p); p = bandTransform.Transform(p); var lt = RenderHelpers.ApplyLights(lighting, 0, p, lightingRadius, nr); if (lt.FogMode != FogModes.Linear || VectorMath.DistanceSquared(cameraPos, p) <= (lightingRadius + lt.FogRange.Y) * (lightingRadius + lt.FogRange.Y)) { buffer.AddCommand( bandShader.Shader, bandShaderDelegate, bandShaderCleanup, bandTransform, lt, new RenderUserData() { Float = field.Band.TextureAspect, Color = field.Band.ColorShift, Camera = _camera, Texture = tex, Matrix2 = bandNormal }, bandCylinder.VertexBuffer, PrimitiveTypes.TriangleList, 0, i * 6, 2, true, SortLayers.OBJECT, zcoord ); } } } }
public void DrawPerspective( Texture2D texture, Vector3 pos, Matrix4 world, Vector2 size, Color4 color, Vector2 topleft, Vector2 topright, Vector2 bottomleft, Vector2 bottomright, Vector3 normal, float angle, int layer, BlendMode blend = BlendMode.Normal ) { var upref = Vector3.UnitY; if ((Vector3.UnitY - normal).Length < float.Epsilon) { upref = Vector3.UnitZ; } var srcright = Vector3.Cross(normal, upref); var srcup = Vector3.Cross(srcright, normal); srcup.Normalize(); srcright.Normalize(); Vector3 up, right; if (Math.Abs(angle) < float.Epsilon) { up = srcup; right = srcright; } else { var s = (float)Math.Sin(angle); var c = (float)Math.Cos(angle); up = c * srcright - s * srcup; right = s * srcright + c * srcup; } rendat[billboardCount] = new RenderData( texture, blend, RenderKind.Rect, (ushort)vertexCountRect ); // var sz = 0.5f * size; verticesRect[vertexCountRect++] = new VertexPositionColorTexture( VectorMath.Transform( pos - right * sz.X - up * sz.Y, world ), color, bottomleft ); verticesRect[vertexCountRect++] = new VertexPositionColorTexture( VectorMath.Transform( pos + right * sz.X - up * sz.Y, world ), color, topleft ); verticesRect[vertexCountRect++] = new VertexPositionColorTexture( VectorMath.Transform( pos - right * sz.X + up * sz.Y, world ), color, bottomright ); verticesRect[vertexCountRect++] = new VertexPositionColorTexture( VectorMath.Transform( pos + right * sz.X + up * sz.Y, world ), color, topright ); // var z = RenderHelpers.GetZ(camera.Position, pos); buffer.AddCommand( this, rendat[billboardCount].GetHashCode(), billboardCount, layer, z ); billboardCount++; }
public void Draw(ResourceManager res, SystemLighting lighting, CommandBuffer buffer, NebulaRenderer nr) { //Null check if (_camera == null) { return; } //Asteroids! if (Vector3.DistanceSquared(cameraPos, field.Zone.Position) <= renderDistSq) { float fadeNear = field.FillDist - 100f; float fadeFar = field.FillDist; if (field.Cube.Count > 0) { if (cubeCount == -1) { return; } asteroidsTask.Wait(); for (int i = 0; i < cubeDrawCalls.Count; i++) { cubeDrawCalls[i].Material.Update(_camera); } var lt = RenderHelpers.ApplyLights(lighting, 0, cameraPos, field.FillDist, nr); if (lt.FogMode == FogModes.Linear) { lastFog = lt.FogRange.Y; } else { lastFog = float.MaxValue; } int fadeCount = 0; int regCount = 0; for (int j = 0; j < cubeCount; j++) { var center = cubes[j].pos; var z = RenderHelpers.GetZ(cameraPos, center); for (int i = 0; i < cubeDrawCalls.Count; i++) { var dc = cubeDrawCalls[i]; if ((Vector3.Distance(center, cameraPos) + cubeRadius) < fadeNear) { buffer.AddCommand( dc.Material.Render, null, buffer.WorldBuffer.SubmitMatrix(ref cubes[j].tr), lt, cube_vbo, PrimitiveTypes.TriangleList, 0, dc.StartIndex, dc.Count / 3, SortLayers.OBJECT ); regCount++; } else { buffer.AddCommandFade( dc.Material.Render, buffer.WorldBuffer.SubmitMatrix(ref cubes[j].tr), lt, cube_vbo, PrimitiveTypes.TriangleList, dc.StartIndex, dc.Count / 3, SortLayers.OBJECT, new Vector2(fadeNear, fadeFar), z ); fadeCount++; } } } } if (field.BillboardCount != -1) { var cameraLights = RenderHelpers.ApplyLights(lighting, 0, cameraPos, 1, nr); if (billboardTex == null || billboardTex.IsDisposed) { billboardTex = (Texture2D)res.FindTexture(field.BillboardShape.Texture); } billboardTask.Wait(); for (int i = 0; i < billboardCount; i++) { var alpha = BillboardAlpha(Vector3.Distance(calculatedBillboards[i].Position, cameraPos)); if (alpha <= 0) { continue; } var coords = billboardCoords [calculatedBillboards [i].Texture]; sys.Billboards.DrawTri( billboardTex, calculatedBillboards [i].Position, calculatedBillboards[i].Size, new Color4(field.BillboardTint * cameraLights.Ambient, alpha), coords[0], coords[2], coords[1], 0, SortLayers.OBJECT ); } } } //Band is last if (renderBand) { if (!_camera.Frustum.Intersects(new BoundingSphere(field.Zone.Position, lightingRadius))) { return; } var tex = (Texture2D)res.FindTexture(field.Band.Shape); var bandHandle = buffer.WorldBuffer.SubmitMatrix(ref bandTransform); for (int i = 0; i < SIDES; i++) { var p = bandCylinder.GetSidePosition(i); var zcoord = RenderHelpers.GetZ(bandTransform, cameraPos, p); p = Vector3.Transform(p, bandTransform); var lt = RenderHelpers.ApplyLights(lighting, 0, p, lightingRadius, nr); if (lt.FogMode != FogModes.Linear || Vector3.DistanceSquared(cameraPos, p) <= (lightingRadius + lt.FogRange.Y) * (lightingRadius + lt.FogRange.Y)) { buffer.AddCommand( bandShader.Shader, bandShaderDelegate, bandShaderCleanup, bandHandle, lt, new RenderUserData() { Float = field.Band.TextureAspect, Color = field.Band.ColorShift, Camera = _camera, Texture = tex, }, bandCylinder.VertexBuffer, PrimitiveTypes.TriangleList, 0, i * 6, 2, true, SortLayers.OBJECT, zcoord ); } } } }