Box
An axis-aligned box in the world: where it is, how big it is, what it looks like, and whether you can walk through it. One cube mesh is shared by every Box; the box only supplies a transform. That is what keeps a scene of hundreds of boxes down to one uploaded mesh. **That shared mesh must span -1..1 on every axis**, because the model matrix scales it by `half` directly and `half` is a half-extent. Hand Scene a mesh built to -0.5..0.5 instead -- the "unit quad" in Mesh's own example is built that way -- and every box renders at half the size it claims, while OverlapsXZ goes on using the full half-extents. Geometry and collision then disagree with no error anywhere: you walk into walls that are not where they are drawn. The model matrix is computed once and cached, because a static prop's transform does not change between frames. Moving the box invalidates it.
Operations
GetMaterial #
method : public : GetMaterial() ~ MaterialReturn
| Type | Description |
|---|---|
| Material | the material, or Nil when this box only has a texture |
GetModelMatrix #
The box's model matrix: translate then scale, cached after the first call.
method : public : GetModelMatrix() ~ Float[]Return
| Type | Description |
|---|---|
| Float | a 4x4 model matrix, column-major |
IsOpaque #
method : public : IsOpaque() ~ BoolReturn
| Type | Description |
|---|---|
| Bool | true when nothing about this box needs sorting |
IsSolid #
Whether this box blocks movement. Floors and ceilings are usually set non-solid: they are drawn but should not stop a walking character.
method : public : IsSolid() ~ BoolReturn
| Type | Description |
|---|---|
| Bool | true when the box blocks |
New # constructor
New(center:Vector3, half:Vector3, texture:Texture2D)Parameters
| Name | Type | Description |
|---|---|---|
| center | Vector3 | the box's centre |
| half | Vector3 | half-extents on each axis, so a 2x2x2 cube has half 1,1,1 -- which is also why the shared mesh has to span -1..1; see the class note |
| texture | Texture2D | the texture to draw it with; may be Nil |
OverlapsXZ #
Whether a circle in plan view overlaps this box. Deliberately 2D: a walking character should not be blocked by something overhead, and testing the full 3D box would do exactly that. Corners are treated conservatively -- a near-miss at a corner counts as a hit, which is the right way to be wrong about a wall.
method : public : OverlapsXZ(x:Float, z:Float, radius:Float) ~ BoolParameters
| Name | Type | Description |
|---|---|---|
| x | Float | circle centre x |
| z | Float | circle centre z |
| radius | Float | circle radius |
Return
| Type | Description |
|---|---|
| Bool | true when they overlap |
SetCenter #
Move the box, discarding the cached transform.
method : public : SetCenter(center:Vector3) ~ NilParameters
| Name | Type | Description |
|---|---|---|
| center | Vector3 | the new centre |
SetMaterial #
Give this box a full material rather than a bare texture. Takes precedence over the texture it was constructed with -- a box with a material uses the material's texture, its tint and its shininess. Passing Nil goes back to the plain texture, which is what every existing scene uses and still works.
method : public : SetMaterial(material:Material) ~ NilParameters
| Name | Type | Description |
|---|---|---|
| material | Material | the material, or Nil |
SetOpacity #
How opaque this box is. A transparent box is drawn after every solid one, furthest first -- which is what Scene->SetEye is for. Without that ordering a pane in front of another writes depth and hides it, and the result looks worse than no transparency at all.
method : public : SetOpacity(opacity:Float) ~ NilParameters
| Name | Type | Description |
|---|---|---|
| opacity | Float | 0.0 invisible to 1.0 solid |