public void Update() { const int objectCount = 20; _renderers.ForEach(_ => _.Dispose()); for (int i = 0; i < objectCount; i++) { var sceneObject = new Node(Scene); sceneObject.Transform.Parent = Transform; sceneObject.Transform.LocalPosition = 0.3f * new Vector3(-objectCount / 2 + i, 0, 0); var renderer = sceneObject.AddComponent <MeshRenderable>(); renderer.Mesh = _mesh; var material = renderer.Material = new Material(MaterialType.DiffuseColor); material.Color = new Vector4(RandomF.InsideUnitSphere().Normalized, 1); _renderers.Add(renderer); } }
public static Mesh Create(CloudShape shape, float diameter = 1, int vertexCount = 300000) { var vertices = new Vector3Buffer(vertexCount); var normals = new Vector3Buffer(vertexCount); var texCoords = new Vector2Buffer(vertices.Length); for (int i = 0; i < vertices.Length; i++) { Vector3 point; switch (shape) { case CloudShape.Sphere: point = RandomF.InsideUnitSphere(); break; case CloudShape.Cube: point = RandomF.InsideUnitCube(); break; default: throw new InvalidOperationException(); } vertices[i] = point * diameter; normals[i] = point.Normalized; texCoords[i] = new Vector2(vertices[i].X + 0.5f, -vertices[i].Y + 0.5f); } var result = new Mesh() { Vertices = vertices, TexCoords = texCoords, Normals = normals, Type = PrimitiveType.Points }; result.CalculateBounds(); return(result); }
private void AddDeferredTest() { var planeSo = new Node(_scene, "plane"); planeSo.AddComponent <MeshRenderable>().Mesh = Plane.Create(10, 10); planeSo.Transform.LocalRotation = new Quaternion(Vector3.Left, MathF.PI / 2); var sphereMesh = Icosahedron.Create(0.01f, 2); var sphereMaterial = new Material(MaterialType.FlatColor); sphereMaterial.Color = Vector4.One; var lightsParent = new Node(_scene, "lights"); lightsParent.AddComponent <Rotator>().Rotation = new Vector3(0.7, 0, 0); var lightCount = 50; for (int i = 0; i < lightCount; i++) { var so = new Node(_scene); so.Transform.Parent = lightsParent.Transform; var light = so.AddComponent <LightSource>(); var color = new Vector3(RandomF.Float(), RandomF.Float(), RandomF.Float()); color /= MathF.Max(color.X, color.Y, color.Z); light.Diffuse = color; light.Attenuation = new Vector3(0, 4f, 0); var position = Vector3.Zero; while (position.LengthSquared < 0.05f) { position = RandomF.InsideUnitSphere(); } so.Transform.LocalPosition = position * 5; var meshRenderer = so.AddComponent <MeshRenderable>(); meshRenderer.Mesh = sphereMesh; meshRenderer.Material = sphereMaterial; } }
private void InitBufferValues() { for (int i = 0; i < MaxParticles; i++) { _particlePositions[i] = RandomF.InsideUnitSphere(); var color = RandomF.InsideUnitCube(); var maxColor = MathF.Max(color.X, color.Y, color.Z); color /= maxColor; _particleColors[i] = new Vector4(color, 1); _particleData1[i] = new Vector4(50, 0, 0, 0); _particleData2[i] = new Vector4(0); _particleData3[i] = new Vector4(0); } var data = _computeData.Data; data.CurrentParticles = MaxParticles; data.MaxParticles = MaxParticles; data.Time = 0; data.DeltaTime = 0; _computeData.Data = data; }