예제 #1
0
        protected void GenerateParticles()
        {
            // Create particle and index arrays
            if (Mode == BillboardMode.Cross) {
                int crossBillboardNum = 2;
                Vector3 z = Vector3.Zero;
                particles = new ParticleVertex[ParticleNum * crossBillboardNum * 4];
                indices = new int[ParticleNum * crossBillboardNum * 6];

                int x = 0;
                // For each billboard...
                for (int i = 0; i < ParticleNum * 4 * crossBillboardNum; i += 4 * crossBillboardNum) {
                    //Vector3 pos = particlePositions[i / (4 * crossBillboardNum)];
                    Vector3 pos = Vector3.Zero;
                    Vector3 offsetX = new Vector3(ParticleSize.X / 2.0f,
                        ParticleSize.Y / 2.0f, 0);
                    Vector3 offsetZ = new Vector3(0, offsetX.Y, offsetX.X);

                    // Add 4 vertices per rectangle
                    particles[i + 0] = new ParticleVertex(pos +
                        new Vector3(-1, 1, 0) * offsetX, new Vector2(0, 0), z, 0, -1);
                    particles[i + 1] = new ParticleVertex(pos +
                        new Vector3(-1, -1, 0) * offsetX, new Vector2(0, 1), z, 0, -1);
                    particles[i + 2] = new ParticleVertex(pos +
                        new Vector3(1, -1, 0) * offsetX, new Vector2(1, 1), z, 0, -1);
                    particles[i + 3] = new ParticleVertex(pos +
                        new Vector3(1, 1, 0) * offsetX, new Vector2(1, 0), z, 0, -1);
                    particles[i + 4] = new ParticleVertex(pos +
                        new Vector3(0, 1, -1) * offsetZ, new Vector2(0, 0), z, 0, -1);
                    particles[i + 5] = new ParticleVertex(pos +
                        new Vector3(0, -1, -1) * offsetZ, new Vector2(0, 1), z, 0, -1);
                    particles[i + 6] = new ParticleVertex(pos +
                        new Vector3(0, -1, 1) * offsetZ, new Vector2(1, 1), z, 0, -1);
                    particles[i + 7] = new ParticleVertex(pos +
                        new Vector3(0, 1, 1) * offsetZ, new Vector2(1, 0), z, 0, -1);

                    // Add 6 indices per rectangle to form four triangles
                    indices[x++] = i + 0;
                    indices[x++] = i + 3;
                    indices[x++] = i + 2;
                    indices[x++] = i + 2;
                    indices[x++] = i + 1;
                    indices[x++] = i + 0;
                    indices[x++] = i + 0 + 4;
                    indices[x++] = i + 3 + 4;
                    indices[x++] = i + 2 + 4;
                    indices[x++] = i + 2 + 4;
                    indices[x++] = i + 1 + 4;
                    indices[x++] = i + 0 + 4;
                }
            } else {
                particles = new ParticleVertex[ParticleNum * 4];
                indices = new int[ParticleNum * 6];
                Vector3 z = Vector3.Zero;
                int x = 0;

                // Initialize particle settings and fill index and vertex arrays
                for (int i = 0; i < ParticleNum * 4; i += 4) {
                    particles[i + 0] = new ParticleVertex(z, new Vector2(0, 0), z, 0, -1, 0, z);
                    particles[i + 1] = new ParticleVertex(z, new Vector2(0, 1), z, 0, -1, 0, z);
                    particles[i + 2] = new ParticleVertex(z, new Vector2(1, 1), z, 0, -1, 0, z);
                    particles[i + 3] = new ParticleVertex(z, new Vector2(1, 0), z, 0, -1, 0, z);
                    indices[x++] = i + 0;
                    indices[x++] = i + 3;
                    indices[x++] = i + 2;
                    indices[x++] = i + 2;
                    indices[x++] = i + 1;
                    indices[x++] = i + 0;
                }
            }
        }
예제 #2
0
        void GenerateParticles(Vector3[] particlePositions)
        {
            // Create vertex and index arrays
            particles = new ParticleVertex[nBillboards * 4];
            indices = new int[nBillboards * 6];
            int x = 0;
            Vector3 z = Vector3.Zero;
            // For each billboard...
            for (int i = 0; i < nBillboards * 4; i += 4) {
                Vector3 pos = particlePositions[i / 4];
                // Add 4 vertices at the billboard's position
                particles[i + 0] = new ParticleVertex(pos, new Vector2(0, 0), z, 0, -1, 0, End);
                particles[i + 1] = new ParticleVertex(pos, new Vector2(0, 1), z, 0, -1, 0, End);
                particles[i + 2] = new ParticleVertex(pos, new Vector2(1, 1), z, 0, -1, 0, End);
                particles[i + 3] = new ParticleVertex(pos, new Vector2(1, 0), z, 0, -1, 0, End);

                // Add 6 indices to form two triangles
                indices[x++] = i + 0;
                indices[x++] = i + 3;
                indices[x++] = i + 2;
                indices[x++] = i + 2;
                indices[x++] = i + 1;
                indices[x++] = i + 0;
            }

            // Create and set the vertex buffer
            vertexBuffers = new VertexBuffer(graphicsDevice,
                typeof(ParticleVertex),
                nBillboards * 4, BufferUsage.WriteOnly);
            vertexBuffers.SetData<ParticleVertex>(particles);
            // Create and set the index buffer
            indexBuffers = new IndexBuffer(graphicsDevice,
                IndexElementSize.ThirtyTwoBits,
                nBillboards * 6, BufferUsage.WriteOnly);
            indexBuffers.SetData<int>(indices);
        }