public static int generateLightCone(int stacks, int slices, out Buffer vbuf, out Buffer ibuf) { VF.Position3[] vertices = new VF.Position3[(1 + slices + 1) + (stacks + 1) * (slices + 1)]; ushort[] indices = new ushort[(slices + 1) * 2 + 2 + stacks * (slices + 1) * 2]; int verticesIdx = 0; // bottom vertices[verticesIdx++] = new VF.Position3() { Position = Vector3.UnitZ }; for (int sliceNumber = 0; sliceNumber <= slices; ++sliceNumber) { float phi = sliceNumber * 2 * Radians.PI / slices + Radians.PI / 2; float sinPhi = Radians.Sin(phi); float cosPhi = Radians.Cos(phi); vertices[verticesIdx++] = new VF.Position3() { Position = new Vector3(cosPhi, sinPhi, 1.0f) }; } // cone for (int stackNumber = 0; stackNumber <= stacks; ++stackNumber) { for (int sliceNumber = slices; sliceNumber >= 0; --sliceNumber) { float phi = sliceNumber * 2 * Radians.PI / slices + Radians.PI / 2; float sinPhi = Radians.Sin(phi); float cosPhi = Radians.Cos(phi); float t = 1.0f - (float)stackNumber / (float)stacks; vertices[verticesIdx++] = new VF.Position3() { Position = new Vector3(cosPhi * t, sinPhi * t, t) }; } } int indicesIdx = 0; // bottom for (int sliceNumber = 0; sliceNumber <= slices; ++sliceNumber) { indices[indicesIdx++] = (ushort)(0); indices[indicesIdx++] = (ushort)(1 + sliceNumber); } indices[indicesIdx++] = (ushort)(1 + slices); indices[indicesIdx++] = (ushort)(1 + slices); for (int stackNumber = 0; stackNumber < stacks; ++stackNumber) { for (int sliceNumber = 0; sliceNumber <= slices; ++sliceNumber) { indices[indicesIdx++] = (ushort)((1 + slices + 1) + (stackNumber + 1) * (slices + 1) + sliceNumber); indices[indicesIdx++] = (ushort)((1 + slices + 1) + stackNumber * (slices + 1) + sliceNumber); } } vbuf = Device.Current.CreateVertexBuffer(BufferUsage.StaticDraw, vertices); ibuf = Device.Current.CreateIndexBuffer(BufferUsage.StaticDraw, indices); return indicesIdx; }
public static int generateLightSphere(int stacks, int slices, out Buffer vbuf, out Buffer ibuf) { VF.Position3[] vertices = new VF.Position3[(stacks + 1) * (slices + 1)]; ushort[] indices = new ushort[stacks * (slices + 1) * 2]; int verticesIdx = 0; for (int stackNumber = 0; stackNumber <= stacks; ++stackNumber) { for (int sliceNumber = 0; sliceNumber <= slices; ++sliceNumber) { float theta = stackNumber * Radians.PI / stacks; float phi = sliceNumber * 2 * Radians.PI / slices + Radians.PI / 2; float sinTheta = Radians.Sin(theta); float sinPhi = Radians.Sin(phi); float cosTheta = Radians.Cos(theta); float cosPhi = Radians.Cos(phi); vertices[verticesIdx++] = new VF.Position3() { Position = new Vector3(cosPhi * sinTheta, sinPhi * sinTheta, cosTheta) }; } } int indicesIdx = 0; for (int stackNumber = 0; stackNumber < stacks; ++stackNumber) { for (int sliceNumber = 0; sliceNumber <= slices; ++sliceNumber) { indices[indicesIdx++] = (ushort)(stackNumber * (slices + 1) + sliceNumber); indices[indicesIdx++] = (ushort)((stackNumber + 1) * (slices + 1) + sliceNumber); } } vbuf = Device.Current.CreateVertexBuffer(BufferUsage.StaticDraw, vertices); ibuf = Device.Current.CreateIndexBuffer(BufferUsage.StaticDraw, indices); return indicesIdx; }