114 lines
3.2 KiB
Kotlin
114 lines
3.2 KiB
Kotlin
package org.openrndr.extra.meshgenerators
|
|
|
|
import org.openrndr.draw.VertexBuffer
|
|
import org.openrndr.math.Vector3
|
|
|
|
/**
|
|
* Returns a Box mesh
|
|
*
|
|
* @param width the width of the box
|
|
* @param height the height of the box
|
|
* @param depth the depth of the box
|
|
* @param widthSegments the number of segments along the x-axis
|
|
* @param heightSegments the number of segments along the z-axis
|
|
* @param depthSegments the number of segments along the y-axis
|
|
* @param flipNormals generates inside-out geometry if true
|
|
* @return A vertex buffer containing the triangles to render the 3D shape
|
|
*/
|
|
fun boxMesh(
|
|
width: Double = 1.0,
|
|
height: Double = 1.0,
|
|
depth: Double = 1.0,
|
|
widthSegments: Int = 1,
|
|
heightSegments: Int = 1,
|
|
depthSegments: Int = 1,
|
|
flipNormals: Boolean = false
|
|
): VertexBuffer {
|
|
val vb = meshVertexBuffer(
|
|
widthSegments * heightSegments * 6 * 2 +
|
|
widthSegments * depthSegments * 6 * 2 +
|
|
heightSegments * depthSegments * 6 * 2
|
|
)
|
|
vb.put {
|
|
generateBox(
|
|
width, height, depth,
|
|
widthSegments, heightSegments, depthSegments,
|
|
flipNormals, bufferWriter(this)
|
|
)
|
|
}
|
|
return vb
|
|
}
|
|
|
|
/**
|
|
* Generate a box
|
|
*
|
|
* @param width the width of the box
|
|
* @param height the height of the box
|
|
* @param depth the depth of the box
|
|
* @param widthSegments the number of segments along the x-axis
|
|
* @param heightSegments the number of segments along the z-axis
|
|
* @param depthSegments the number of segments along the y-axis
|
|
* @param flipNormals generates inside-out geometry if true
|
|
* @param writer the vertex writer function
|
|
*/
|
|
|
|
fun generateBox(
|
|
width: Double = 1.0,
|
|
height: Double = 1.0,
|
|
depth: Double = 1.0,
|
|
widthSegments: Int = 1,
|
|
heightSegments: Int = 1,
|
|
depthSegments: Int = 1,
|
|
flipNormals: Boolean = false,
|
|
writer: VertexWriter
|
|
) {
|
|
|
|
val sign = if (flipNormals) -1.0 else 1.0
|
|
// +x -- ZY
|
|
generatePlane(
|
|
Vector3(width / 2.0 * sign, 0.0, 0.0),
|
|
Vector3.UNIT_Z, Vector3.UNIT_Y, Vector3.UNIT_X,
|
|
-depth, -height,
|
|
depthSegments, heightSegments, writer
|
|
)
|
|
|
|
// -x -- ZY
|
|
generatePlane(
|
|
Vector3(-width / 2.0 * sign, 0.0, 0.0),
|
|
Vector3.UNIT_Z, Vector3.UNIT_Y, -Vector3.UNIT_X,
|
|
-depth, height,
|
|
depthSegments, heightSegments, writer
|
|
)
|
|
|
|
// +y -- XZ
|
|
generatePlane(
|
|
Vector3(0.0, height / 2.0 * sign, 0.0),
|
|
Vector3.UNIT_X, Vector3.UNIT_Z, Vector3.UNIT_Y,
|
|
width, depth,
|
|
widthSegments, depthSegments, writer
|
|
)
|
|
|
|
// -y -- XZ
|
|
generatePlane(
|
|
Vector3(0.0, -height / 2.0 * sign, 0.0),
|
|
Vector3.UNIT_X, Vector3.UNIT_Z, -Vector3.UNIT_Y,
|
|
width, -depth,
|
|
widthSegments, depthSegments, writer
|
|
)
|
|
|
|
// +z -- XY
|
|
generatePlane(
|
|
Vector3(0.0, 0.0, depth / 2.0 * sign),
|
|
Vector3.UNIT_X, Vector3.UNIT_Y, Vector3.UNIT_Z,
|
|
-width, height,
|
|
widthSegments, heightSegments, writer
|
|
)
|
|
|
|
// -z -- XY
|
|
generatePlane(
|
|
Vector3(0.0, 0.0, -depth / 2.0 * sign),
|
|
Vector3.UNIT_X, Vector3.UNIT_Y, -Vector3.UNIT_Z,
|
|
width, height,
|
|
widthSegments, heightSegments, writer
|
|
)
|
|
} |