* Create cube geometry with custom BufferGeometry. * @param engine - Engine * @param size - Cube size * @returns Cube mesh
(engine: Engine, size: number)
| 60 | * @returns Cube mesh |
| 61 | */ |
| 62 | function createCustomMesh(engine: Engine, size: number): Mesh { |
| 63 | const geometry = new BufferMesh(engine, "CustomCubeGeometry"); |
| 64 | |
| 65 | // Create vertices data. |
| 66 | // prettier-ignore |
| 67 | const vertices: Float32Array = new Float32Array([ |
| 68 | // Up |
| 69 | -size, size, -size, 0, 1, 0, size, size, -size, 0, 1, 0, size, size, size, 0, 1, 0, -size, size, size, 0, 1, 0, |
| 70 | // Down |
| 71 | -size, -size, -size, 0, -1, 0, size, -size, -size, 0, -1, 0, size, -size, size, 0, -1, 0, -size, -size, size, 0, -1, 0, |
| 72 | // Left |
| 73 | -size, size, -size, -1, 0, 0, -size, size, size, -1, 0, 0, -size, -size, size, -1, 0, 0, -size, -size, -size, -1, 0, 0, |
| 74 | // Right |
| 75 | size, size, -size, 1, 0, 0, size, size, size, 1, 0, 0, size, -size, size, 1, 0, 0, size, -size, -size, 1, 0, 0, |
| 76 | // Front |
| 77 | -size, size, size, 0, 0, 1, size, size, size, 0, 0, 1, size, -size, size, 0, 0, 1, -size, -size, size, 0, 0, 1, |
| 78 | // Back |
| 79 | -size, size, -size, 0, 0, -1, size, size, -size, 0, 0, -1, size, -size, -size, 0, 0, -1, -size, -size, -size, 0, 0, -1]); |
| 80 | |
| 81 | // Create instance data. |
| 82 | const instanceCount = 4000; |
| 83 | const instanceStride = 6; |
| 84 | const instanceData: Float32Array = new Float32Array(instanceCount * instanceStride); |
| 85 | for (let i = 0; i < instanceCount; i++) { |
| 86 | const offset = i * instanceStride; |
| 87 | // instance offset |
| 88 | instanceData[offset] = (Math.random() - 0.5) * 60; |
| 89 | instanceData[offset + 1] = (Math.random() - 0.5) * 60; |
| 90 | instanceData[offset + 2] = (Math.random() - 0.5) * 60; |
| 91 | // instance color |
| 92 | instanceData[offset + 3] = Math.random(); |
| 93 | instanceData[offset + 4] = Math.random(); |
| 94 | instanceData[offset + 5] = Math.random(); |
| 95 | } |
| 96 | |
| 97 | // Create indices data. |
| 98 | // prettier-ignore |
| 99 | const indices: Uint16Array = new Uint16Array([ |
| 100 | // Up |
| 101 | 0, 2, 1, 2, 0, 3, |
| 102 | // Down |
| 103 | 4, 6, 7, 6, 4, 5, |
| 104 | // Left |
| 105 | 8, 10, 9, 10, 8, 11, |
| 106 | // Right |
| 107 | 12, 14, 15, 14, 12, 13, |
| 108 | // Front |
| 109 | 16, 18, 17, 18, 16, 19, |
| 110 | // Back |
| 111 | 20, 22, 23, 22, 20, 21]); |
| 112 | |
| 113 | // Create gpu vertex buffer and index buffer. |
| 114 | const vertexBuffer = new Buffer(engine, BufferBindFlag.VertexBuffer, vertices, BufferUsage.Static); |
| 115 | const instanceVertexBuffer = new Buffer(engine, BufferBindFlag.VertexBuffer, instanceData, BufferUsage.Static); |
| 116 | const indexBuffer = new Buffer(engine, BufferBindFlag.IndexBuffer, indices, BufferUsage.Static); |
| 117 | |
| 118 | // Bind buffer |
| 119 | geometry.setVertexBufferBinding(vertexBuffer, 24, 0); |
no test coverage detected