public ATMOSkySceneNode(Texture tex, SceneNode parent, SceneManager mgr, int faces, int id) : base(parent, mgr, id) { smgr = mgr; AutomaticCulling = CullingType.Off; material = new Material(); material.Lighting = false; material.ZBuffer = 0; material.Texture1 = tex; face = faces; vertices = new Vertex3D[face + 1]; indices = new ushort[face * 3]; double angle = 0.0f; double angle2 = 360.0f / face; vert = 0; //vertice nr int nr = -3; //indices nr vertices[0] = new Vertex3D(Vector3D.From(0.0f, 100.0f, 0.0f), Vector3D.From(0.0568988f, 0.688538f, -0.722965f), Color.White, Vector2D.From(0.0f, 0.1f) ); double x, z; for (ushort n = 1; n < face + 1; n++) { vert++; nr += 3; x = Math.Cos(angle * 0.017453292519943295769236907684886f) * 100; z = Math.Sin(angle * 0.017453292519943295769236907684886f) * 100; vertices[vert] = new Vertex3D(Vector3D.From((float)x, -5.0f, (float)z), Vector3D.From(0.0568988f, 0.688538f, -0.722965f), Color.White, Vector2D.From(0.0f, 0.9f) ); angle = angle + angle2; indices[nr] = 0; indices[nr + 1] = (ushort)vert; indices[nr + 2] = (ushort)(vert + 1); } indices[nr + 2] = 1; }
public LensflareSceneNode(SceneNode parent, SceneManager mgr, int id, Vector3D position) : base(parent, mgr, id) { draw_flare = true; ign_geom = false; smgr = mgr; indices = new ushort[6]; indices[0] = 0; indices[1] = 2; indices[2] = 1; indices[3] = 0; indices[4] = 3; indices[5] = 2; vertices = new Vertex3D[4]; for (int i = 0; i < 4; i++) { vertices[i] = new Vertex3D(); } vertices[0].TCoords = Vector2D.From(0.0f, 1.0f); vertices[0].Color = Color.White; vertices[1].TCoords = Vector2D.From(0.0f, 0.0f); vertices[1].Color = Color.White; vertices[2].TCoords = Vector2D.From(1.0f, 0.0f); vertices[2].Color = Color.White; vertices[3].TCoords = Vector2D.From(1.0f, 1.0f); vertices[3].Color = Color.White; material = new Material(); material.Lighting = false; material.MaterialType = MaterialType.TransparentAddColor; material.ZBuffer = 0; material.ZWriteEnable = false; bbox = new Box3D(); bbox.MinEdge = Vector3D.From(-2, -2, -2); bbox.MaxEdge = Vector3D.From(2, 2, 2); }
public BeamNode(SceneNode parent, SceneManager mgr, int id, string szBeam) : base(parent, mgr, id) { smgr = mgr; driver = smgr.VideoDriver; Material = new Material(); // Setup the beam material Material.Wireframe = false; Material.Lighting = false; Material.MaterialType = MaterialType.TransparentAlphaChannel; Material.Texture1 = mgr.VideoDriver.GetTexture(szBeam); // Default to 32 units for the scale flScale = 32.0f; // Default to white beamColor.Set(255, 255, 255, 255); }
public void SetBasicRenderStates(Material material, Material lastmaterial, bool resetAllRenderstates) { MaterialRendererServices_SetBasicRenderStates(_raw, material.Raw, lastmaterial.Raw, resetAllRenderstates); }
public void SetMaterial(Material mat) { VideoDriver_SetMaterial(_raw, mat.Raw); }
public P3DSimplexNoiseTerrain(SceneNode parent, SceneManager mgr, int id, int vertsPerRow, int vertsPerCol, int cellSpacing, float heightScale) : base(parent, mgr, id) { _mgr = mgr; _driver = _mgr.VideoDriver; Material = new Material(); Material.Lighting = false; _numVertsPerRow = vertsPerRow; _numVertsPerCol = vertsPerCol; _cellSpacing = cellSpacing; _heightScale = heightScale; _numCellsPerRow = _numVertsPerRow - 1; _numCellsPerCol = _numVertsPerCol - 1; _width = _numCellsPerRow * _cellSpacing; _depth = _numCellsPerCol * _cellSpacing; NumVertices = _numVertsPerRow * _numVertsPerCol; _numIndices = (_numCellsPerRow * _numCellsPerCol) * 6; _numTriangles = (_numCellsPerRow * _numCellsPerCol) * 2; _indices = new ushort[_numIndices]; int startX = -_width / 2; int startZ = _depth / 2; int endX = _width / 2; int endZ = -_depth / 2; Box3D = new Box3D(new Vector3D(startX, -_heightScale, startZ), new Vector3D(endX, _heightScale, endZ)); float uCoordIncrementSize = 1.0f; float vCoordIncrementSize = 1.0f; _heights = new float[NumVertices]; int i = 0; for (int z = startZ; z >= endZ; z -= _cellSpacing) { int j = 0; for (int x = startX; x <= endX; x += _cellSpacing) { int index = i * _numVertsPerRow + j; float height;// = noise.PerlinNoise1F(x, 100*heightScale, 0.001f); // large noise. height = PerlinSimplexNoise.noise(x * 0.0001f, z * 0.0001f) * _heightScale; // detail noise. height += PerlinSimplexNoise.noise(x * 0.001f, z * 0.001f) * _heightScale / 10; Vertex3D v = new Vertex3D( new Vector3D(x, height, z), new Vector3D(0, 1, 0), Color.Black, new Vector2D(j * uCoordIncrementSize, i * vCoordIncrementSize) ); _buffer.SetVertex((uint)index, v); j++; } i++; } uint baseIndex = 0; for (uint k = 0; k < _numCellsPerRow; k++) { for (uint j = 0; j < _numCellsPerCol; j++) { _buffer.SetIndex(baseIndex + 0, (ushort)(k * _numVertsPerRow + j)); _buffer.SetIndex(baseIndex + 1, (ushort)(k * _numVertsPerRow + j + 1)); _buffer.SetIndex(baseIndex + 2, (ushort)((k + 1) * _numVertsPerRow + j)); _buffer.SetIndex(baseIndex + 3, (ushort)((k + 1) * _numVertsPerRow + j)); _buffer.SetIndex(baseIndex + 4, (ushort)(k * _numVertsPerRow + j + 1)); _buffer.SetIndex(baseIndex + 5, (ushort)((k + 1) * _numVertsPerRow + j + 1)); baseIndex += 6; } } }
public override void Render() { VideoDriver driver = _mgr.VideoDriver; CameraSceneNode camera = _mgr.ActiveCamera; if (camera == null || driver == null) return; if (!redrawnextloop) { driver.SetTransform(TransformationState.World, AbsoluteTransformation); driver.SetMaterial(_material); driver.DrawIndexedTriangleList(Vertices, lastdrawcount * 4, Indices, lastdrawcount * 4); } else { ReallocateBuffers(); Vector3D campos = camera.AbsolutePosition; Box3D cbox = camera.ViewFrustum.BoundingBox; Vector3D pos = Position; int drawcount = 0; int max = (Particles.Length < MaxDensity) ? Particles.Length : MaxDensity; double d = pos.DistanceFrom(campos) / GRASS_PATCH_SIZE; if (d > 1.0) max = (int)(((double)max) / d); //Matrix4 m = new Matrix4(); for (int i = 0; i < max; i++) { int idx = drawcount * 4; GrassParticle particle = Particles[i]; Vector3D gpos = particle.pos + pos; double dist = campos.DistanceFromSQ(gpos); if (dist > NewMath.Sqr(DrawDistance)) continue; if (!cbox.IsPointInside(gpos)) continue; if (dist > NewMath.Sqr(DrawDistance * 0.5)) { if (particle.sprite.Height == 0) { float i1 = ((float)i) / ((float)max); float i2 = ((float)(dist / DrawDistance)) / 2f; if (i1 < i2) continue; } } int igridsize = GRASS_PATCH_SIZE / (int)WindRes; int ihalfres = (int)WindRes / 2; int xgrid = (int)(particle.pos.X / (igridsize) + ihalfres); int zgrid = (int)(particle.pos.Z / (igridsize) + ihalfres); float xnext = particle.pos.X / (GRASS_PATCH_SIZE / WindRes) + (WindRes / 2f) - xgrid; float znext = particle.pos.Z / (GRASS_PATCH_SIZE / WindRes) + (WindRes / 2f) - zgrid; Vector2D wind1 = WindGrid[xgrid * WindRes + zgrid]; Vector2D wind2 = WindGrid[(xgrid + 1) * WindRes + zgrid]; Vector2D wind3 = WindGrid[xgrid * (WindRes + 1) + zgrid]; Vector2D wind4 = WindGrid[(xgrid + 1) * (WindRes + 1) + zgrid]; Vector2D wind2d = wind1 * (1.0f - xnext) * (1.0f - znext) + wind2 * xnext * (1.0f - znext) + wind3 * (1.0f - xnext) * znext + wind4 * xnext * znext; wind2d *= particle.flex; Vector3D wind = new Vector3D(wind2d.X, 0f, wind2d.Y); Color gcol = new Color(particle.color.A, (int)(particle.color.R * 0.8f), (int)(particle.color.G * 0.8f), (int)(particle.color.B * 0.8f)); Vertices[0 + idx].Position = particle.points[0]; Vertices[0 + idx].Color = gcol; Vertices[1 + idx].Position = particle.points[1] + wind; Vertices[1 + idx].Color = particle.color; Vertices[2 + idx].Position = particle.points[2] + wind; Vertices[2 + idx].Color = particle.color; Vertices[3 + idx].Position = particle.points[3]; Vertices[3 + idx].Color = gcol; int arrpos = (_imagecount.Width * particle.sprite.Height) + particle.sprite.Width; Vertices[0 + idx].TCoords = new Vector2D(v1[arrpos], v2[arrpos]); Vertices[1 + idx].TCoords = new Vector2D(v1[arrpos], v3[arrpos]); Vertices[2 + idx].TCoords = new Vector2D(v4[arrpos], v3[arrpos]); Vertices[3 + idx].TCoords = new Vector2D(v4[arrpos], v2[arrpos]); drawcount++; } driver.SetTransform(TransformationState.World, AbsoluteTransformation); driver.SetMaterial(_material); driver.DrawIndexedTriangleList(Vertices, drawcount * 4, Indices, drawcount * 4); lastdrawcount = drawcount; } if (DebugDataVisible == DebugSceneType.BoundingBox) { driver.SetTransform(TransformationState.World, AbsoluteTransformation); Material m = new Material(); m.Lighting = false; driver.SetMaterial(m); driver.Draw3DBox(BoundingBox, Color.From(0, 255, 255, 255)); Box3D b2 = new Box3D(); b2.AddInternalPoint(BoundingBox.MaxEdge * 0.01f); driver.Draw3DBox(b2, Color.From(0, 255, 255, 255)); } }
public void CopyTo(Material dest) { dest.AmbientColor = AmbientColor; dest.BackfaceCulling = BackfaceCulling; dest.DiffuseColor = DiffuseColor; dest.EmissiveColor = EmissiveColor; dest.FogEnable = FogEnable; dest.GouraudShading = GouraudShading; dest.Lighting = Lighting; dest.MaterialType = MaterialType; dest.MaterialTypeParam = MaterialTypeParam; dest.NormalizeNormals = NormalizeNormals; dest.Shininess = Shininess; dest.SpecularColor = SpecularColor; dest.Texture1 = Texture1; dest.Texture2 = Texture2; dest.Texture3 = Texture3; dest.Texture4 = Texture4; dest.Wireframe = Wireframe; dest.ZBuffer = ZBuffer; dest.ZWriteEnable = ZWriteEnable; }