1 /** 2 * Copyright: Copyright (C) 2018 Gabriel Gheorghe, All Rights Reserved 3 * Authors: $(Gabriel Gheorghe) 4 * License: $(LINK2 https://www.gnu.org/licenses/gpl-3.0.txt, GNU GENERAL PUBLIC LICENSE Version 3, 29 June 2007) 5 * Source: $(LINK2 https://github.com/GabyForceQ/LibertyEngine/blob/master/source/liberty/framework/primitive/bsp.d) 6 * Documentation: 7 * Coverage: 8 **/ 9 module liberty.framework.primitive.bsp; 10 11 import liberty.framework.primitive.vertex; 12 import liberty.framework.terrain.vertex; 13 import liberty.framework.primitive.impl; 14 import liberty.material.impl; 15 import liberty.math.vector; 16 import liberty.model.impl; 17 import liberty.model.io; 18 import liberty.scene.entity; 19 import liberty.scene.meta; 20 21 /** 22 * 23 **/ 24 abstract class BSPVolume : Primitive { 25 /** 26 * 27 **/ 28 this(string id) { 29 super(id); 30 } 31 } 32 33 /** 34 * 35 **/ 36 final class BSPCube : BSPVolume { 37 mixin NodeBody; 38 39 /** 40 * 41 **/ 42 this(string id) { 43 super(id); 44 register; 45 } 46 47 /** 48 * 49 * Returns reference to this so it can be used in a stream. 50 **/ 51 typeof(this) build(Material material = Material.getDefault()) { 52 model = new Model(ModelIO.loadRawModel(cubeVertices), [material]); 53 return this; 54 } 55 } 56 57 /** 58 * 59 **/ 60 final class BSPPyramid : BSPVolume { 61 mixin NodeBody; 62 63 /** 64 * 65 **/ 66 this(string id) { 67 super(id); 68 register; 69 } 70 71 /** 72 * 73 * Returns reference to this so it can be used in a stream. 74 **/ 75 typeof(this) build(Material material = Material.getDefault()) { 76 model = new Model(ModelIO.loadRawModel(pyramidVertices), [material]); 77 return this; 78 } 79 } 80 81 /** 82 * 83 **/ 84 final class BSPSquare : BSPVolume { 85 mixin NodeBody; 86 87 /** 88 * 89 **/ 90 this(string id) { 91 super(id); 92 register; 93 } 94 95 /** 96 * 97 * Returns reference to this so it can be used in a stream. 98 **/ 99 typeof(this) build(Material material = Material.getDefault()) { 100 model = new Model(ModelIO.loadRawModel(squareVertices, squareIndices), [material]); 101 return this; 102 } 103 } 104 105 /** 106 * 107 **/ 108 final class BSPTriangle : BSPVolume { 109 mixin NodeBody; 110 111 /** 112 * 113 **/ 114 this(string id) { 115 super(id); 116 register; 117 } 118 119 /** 120 * 121 * Returns reference to this so it can be used in a stream. 122 **/ 123 typeof(this) build(Material material = Material.getDefault()) { 124 model = new Model(ModelIO.loadRawModel(triangleVertices, triangleIndices), [material]); 125 return this; 126 } 127 } 128 129 private PrimitiveVertex[36] cubeVertices = [ 130 // back 131 PrimitiveVertex(Vector3F( 0.5f, 0.5f, -0.5f), Vector3F(0.0f, 0.0f, -1.0f), Vector2F(0.0f, 1.0f)), 132 PrimitiveVertex(Vector3F( 0.5f, -0.5f, -0.5f), Vector3F(0.0f, 0.0f, -1.0f), Vector2F(0.0f, 0.0f)), 133 PrimitiveVertex(Vector3F(-0.5f, -0.5f, -0.5f), Vector3F(0.0f, 0.0f, -1.0f), Vector2F(1.0f, 0.0f)), 134 PrimitiveVertex(Vector3F(-0.5f, -0.5f, -0.5f), Vector3F(0.0f, 0.0f, -1.0f), Vector2F(1.0f, 0.0f)), 135 PrimitiveVertex(Vector3F(-0.5f, 0.5f, -0.5f), Vector3F(0.0f, 0.0f, -1.0f), Vector2F(1.0f, 1.0f)), 136 PrimitiveVertex(Vector3F( 0.5f, 0.5f, -0.5f), Vector3F(0.0f, 0.0f, -1.0f), Vector2F(0.0f, 1.0f)), 137 138 // front 139 PrimitiveVertex(Vector3F(-0.5f, -0.5f, 0.5f), Vector3F(0.0f, 0.0f, 1.0f), Vector2F(0.0f, 0.0f)), 140 PrimitiveVertex(Vector3F( 0.5f, -0.5f, 0.5f), Vector3F(0.0f, 0.0f, 1.0f), Vector2F(1.0f, 0.0f)), 141 PrimitiveVertex(Vector3F( 0.5f, 0.5f, 0.5f), Vector3F(0.0f, 0.0f, 1.0f), Vector2F(1.0f, 1.0f)), 142 PrimitiveVertex(Vector3F( 0.5f, 0.5f, 0.5f), Vector3F(0.0f, 0.0f, 1.0f), Vector2F(1.0f, 1.0f)), 143 PrimitiveVertex(Vector3F(-0.5f, 0.5f, 0.5f), Vector3F(0.0f, 0.0f, 1.0f), Vector2F(0.0f, 1.0f)), 144 PrimitiveVertex(Vector3F(-0.5f, -0.5f, 0.5f), Vector3F(0.0f, 0.0f, 1.0f), Vector2F(0.0f, 0.0f)), 145 146 // left 147 PrimitiveVertex(Vector3F(-0.5f, 0.5f, 0.5f), Vector3F(-1.0f, 0.0f, 0.0f), Vector2F(1.0f, 1.0f)), 148 PrimitiveVertex(Vector3F(-0.5f, 0.5f, -0.5f), Vector3F(-1.0f, 0.0f, 0.0f), Vector2F(0.0f, 1.0f)), 149 PrimitiveVertex(Vector3F(-0.5f, -0.5f, -0.5f), Vector3F(-1.0f, 0.0f, 0.0f), Vector2F(0.0f, 0.0f)), 150 PrimitiveVertex(Vector3F(-0.5f, -0.5f, -0.5f), Vector3F(-1.0f, 0.0f, 0.0f), Vector2F(0.0f, 0.0f)), 151 PrimitiveVertex(Vector3F(-0.5f, -0.5f, 0.5f), Vector3F(-1.0f, 0.0f, 0.0f), Vector2F(1.0f, 0.0f)), 152 PrimitiveVertex(Vector3F(-0.5f, 0.5f, 0.5f), Vector3F(-1.0f, 0.0f, 0.0f), Vector2F(1.0f, 1.0f)), 153 154 // right 155 PrimitiveVertex(Vector3F( 0.5f, -0.5f, -0.5f), Vector3F(1.0f, 0.0f, 0.0f), Vector2F(1.0f, 0.0f)), 156 PrimitiveVertex(Vector3F( 0.5f, 0.5f, -0.5f), Vector3F(1.0f, 0.0f, 0.0f), Vector2F(1.0f, 1.0f)), 157 PrimitiveVertex(Vector3F( 0.5f, 0.5f, 0.5f), Vector3F(1.0f, 0.0f, 0.0f), Vector2F(0.0f, 1.0f)), 158 PrimitiveVertex(Vector3F( 0.5f, 0.5f, 0.5f), Vector3F(1.0f, 0.0f, 0.0f), Vector2F(0.0f, 1.0f)), 159 PrimitiveVertex(Vector3F( 0.5f, -0.5f, 0.5f), Vector3F(1.0f, 0.0f, 0.0f), Vector2F(0.0f, 0.0f)), 160 PrimitiveVertex(Vector3F( 0.5f, -0.5f, -0.5f), Vector3F(1.0f, 0.0f, 0.0f), Vector2F(1.0f, 0.0f)), 161 162 // bottom 163 PrimitiveVertex(Vector3F(-0.5f, -0.5f, -0.5f), Vector3F(0.0f, -1.0f, 0.0f), Vector2F(0.0f, 0.0f)), 164 PrimitiveVertex(Vector3F( 0.5f, -0.5f, -0.5f), Vector3F(0.0f, -1.0f, 0.0f), Vector2F(1.0f, 0.0f)), 165 PrimitiveVertex(Vector3F( 0.5f, -0.5f, 0.5f), Vector3F(0.0f, -1.0f, 0.0f), Vector2F(1.0f, 1.0f)), 166 PrimitiveVertex(Vector3F( 0.5f, -0.5f, 0.5f), Vector3F(0.0f, -1.0f, 0.0f), Vector2F(1.0f, 1.0f)), 167 PrimitiveVertex(Vector3F(-0.5f, -0.5f, 0.5f), Vector3F(0.0f, -1.0f, 0.0f), Vector2F(0.0f, 1.0f)), 168 PrimitiveVertex(Vector3F(-0.5f, -0.5f, -0.5f), Vector3F(0.0f, -1.0f, 0.0f), Vector2F(0.0f, 0.0f)), 169 170 // top 171 PrimitiveVertex(Vector3F( 0.5f, 0.5f, 0.5f), Vector3F(0.0f, 1.0f, 0.0f), Vector2F(1.0f, 0.0f)), 172 PrimitiveVertex(Vector3F( 0.5f, 0.5f, -0.5f), Vector3F(0.0f, 1.0f, 0.0f), Vector2F(1.0f, 1.0f)), 173 PrimitiveVertex(Vector3F(-0.5f, 0.5f, -0.5f), Vector3F(0.0f, 1.0f, 0.0f), Vector2F(0.0f, 1.0f)), 174 PrimitiveVertex(Vector3F(-0.5f, 0.5f, -0.5f), Vector3F(0.0f, 1.0f, 0.0f), Vector2F(0.0f, 1.0f)), 175 PrimitiveVertex(Vector3F(-0.5f, 0.5f, 0.5f), Vector3F(0.0f, 1.0f, 0.0f), Vector2F(0.0f, 0.0f)), 176 PrimitiveVertex(Vector3F( 0.5f, 0.5f, 0.5f), Vector3F(0.0f, 1.0f, 0.0f), Vector2F(1.0f, 0.0f)) 177 ]; 178 179 private PrimitiveVertex[36] pyramidVertices = [ 180 // back 181 PrimitiveVertex(Vector3F( 0.0f, 0.5f, 0.0f), Vector3F(0.0f, 0.0f, -1.0f), Vector2F(0.5f, 1.0f)), 182 PrimitiveVertex(Vector3F( 0.5f, -0.5f, -0.5f), Vector3F(0.0f, 0.0f, -1.0f), Vector2F(0.0f, 0.0f)), 183 PrimitiveVertex(Vector3F(-0.5f, -0.5f, -0.5f), Vector3F(0.0f, 0.0f, -1.0f), Vector2F(1.0f, 0.0f)), 184 185 // front 186 PrimitiveVertex(Vector3F(-0.5f, -0.5f, 0.5f), Vector3F(0.0f, 0.0f, 1.0f), Vector2F(0.0f, 0.0f)), 187 PrimitiveVertex(Vector3F( 0.5f, -0.5f, 0.5f), Vector3F(0.0f, 0.0f, 1.0f), Vector2F(1.0f, 0.0f)), 188 PrimitiveVertex(Vector3F( 0.0f, 0.5f, 0.0f), Vector3F(0.0f, 0.0f, 1.0f), Vector2F(0.5f, 1.0f)), 189 190 // left 191 PrimitiveVertex(Vector3F(-0.5f, -0.5f, -0.5f), Vector3F(-1.0f, 0.0f, 0.0f), Vector2F(0.0f, 0.0f)), 192 PrimitiveVertex(Vector3F(-0.5f, -0.5f, 0.5f), Vector3F(-1.0f, 0.0f, 0.0f), Vector2F(1.0f, 0.0f)), 193 PrimitiveVertex(Vector3F( 0.0f, 0.5f, 0.0f), Vector3F(-1.0f, 0.0f, 0.0f), Vector2F(0.5f, 1.0f)), 194 195 // right 196 PrimitiveVertex(Vector3F(0.0f, 0.5f, 0.0f), Vector3F(1.0f, 0.0f, 0.0f), Vector2F(0.5f, 1.0f)), 197 PrimitiveVertex(Vector3F(0.5f, -0.5f, 0.5f), Vector3F(1.0f, 0.0f, 0.0f), Vector2F(0.0f, 0.0f)), 198 PrimitiveVertex(Vector3F(0.5f, -0.5f, -0.5f), Vector3F(1.0f, 0.0f, 0.0f), Vector2F(1.0f, 0.0f)), 199 200 // bottom 201 PrimitiveVertex(Vector3F(-0.5f, -0.5f, -0.5f), Vector3F(0.0f, -1.0f, 0.0f), Vector2F(0.0f, 0.0f)), 202 PrimitiveVertex(Vector3F( 0.5f, -0.5f, -0.5f), Vector3F(0.0f, -1.0f, 0.0f), Vector2F(1.0f, 0.0f)), 203 PrimitiveVertex(Vector3F( 0.5f, -0.5f, 0.5f), Vector3F(0.0f, -1.0f, 0.0f), Vector2F(1.0f, 1.0f)), 204 PrimitiveVertex(Vector3F( 0.5f, -0.5f, 0.5f), Vector3F(0.0f, -1.0f, 0.0f), Vector2F(1.0f, 1.0f)), 205 PrimitiveVertex(Vector3F(-0.5f, -0.5f, 0.5f), Vector3F(0.0f, -1.0f, 0.0f), Vector2F(0.0f, 1.0f)), 206 PrimitiveVertex(Vector3F(-0.5f, -0.5f, -0.5f), Vector3F(0.0f, -1.0f, 0.0f), Vector2F(0.0f, 0.0f)), 207 ]; 208 209 private PrimitiveVertex[] squareVertices = [ 210 PrimitiveVertex(Vector3F(-0.5f, 0.5f, 0.0f), Vector3F(0.0f, 0.0f, 1.0f), Vector2F(0.0f, 1.0f)), 211 PrimitiveVertex(Vector3F(-0.5f, -0.5f, 0.0f), Vector3F(0.0f, 0.0f, 1.0f), Vector2F(0.0f, 0.0f)), 212 PrimitiveVertex(Vector3F( 0.5f, -0.5f, 0.0f), Vector3F(0.0f, 0.0f, 1.0f), Vector2F(1.0f, 0.0f)), 213 PrimitiveVertex(Vector3F( 0.5f, 0.5f, 0.0f), Vector3F(0.0f, 0.0f, 1.0f), Vector2F(1.0f, 1.0f)) 214 ]; 215 216 private uint[6] squareIndices = [ 217 0, 1, 2, 218 0, 2, 3 219 ]; 220 221 private PrimitiveVertex[3] triangleVertices = [ 222 PrimitiveVertex(Vector3F( 0.0f, 0.5f, 0.0f), Vector3F(0.0f, 0.0f, 1.0f), Vector2F(0.5f, 1.0f)), 223 PrimitiveVertex(Vector3F(-0.5f, -0.5f, 0.0f), Vector3F(0.0f, 0.0f, 1.0f), Vector2F(0.0f, 0.0f)), 224 PrimitiveVertex(Vector3F( 0.5f, -0.5f, 0.0f), Vector3F(0.0f, 0.0f, 1.0f), Vector2F(1.0f, 0.0f)) 225 ]; 226 227 private uint[3] triangleIndices = [ 228 0, 1, 2 229 ];