예제 #1
0
        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);
            }
        }
예제 #2
0
        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);
        }
예제 #3
0
        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;
            }
        }
예제 #4
0
        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;
        }