| 61 |
61 |
|
| 62 |
62 |
var mJobNode: Array<DeferredJobs.JobNode?>
|
| 63 |
63 |
|
|
64 |
companion object
|
|
65 |
{
|
|
66 |
private const val ASSOC_UBO_BINDING = 3
|
|
67 |
private const val CENTER_UBO_BINDING = 4
|
|
68 |
|
|
69 |
// sizes of attributes of an individual vertex.
|
|
70 |
private const val POS_DATA_SIZE = 3 // vertex coordinates: x,y,z
|
|
71 |
private const val NOR_DATA_SIZE = 3 // normal vector: x,y,z
|
|
72 |
private const val TEX_DATA_SIZE = 2 // texture coordinates: s,t
|
|
73 |
private const val COM_DATA_SIZE = 1 // component number, a single float
|
|
74 |
|
|
75 |
const val POS_ATTRIB: Int = 0
|
|
76 |
const val NOR_ATTRIB: Int = POS_DATA_SIZE
|
|
77 |
const val TEX_ATTRIB: Int = 0
|
|
78 |
const val COM_ATTRIB: Int = TEX_DATA_SIZE
|
|
79 |
|
|
80 |
const val VERT1_ATTRIBS: Int = POS_DATA_SIZE+NOR_DATA_SIZE // number of attributes of a vertex (the part changed by preapply)
|
|
81 |
const val VERT2_ATTRIBS: Int = TEX_DATA_SIZE+COM_DATA_SIZE // number of attributes of a vertex (the 'preapply invariant' part)
|
|
82 |
const val TRAN_ATTRIBS: Int = POS_DATA_SIZE+NOR_DATA_SIZE // number of attributes of a transform feedback vertex
|
|
83 |
|
|
84 |
private const val BYTES_PER_FLOAT = 4
|
|
85 |
|
|
86 |
private const val OFFSET_POS = POS_ATTRIB*BYTES_PER_FLOAT
|
|
87 |
private const val OFFSET_NOR = NOR_ATTRIB*BYTES_PER_FLOAT
|
|
88 |
private const val OFFSET_TEX = TEX_ATTRIB*BYTES_PER_FLOAT
|
|
89 |
private const val OFFSET_COM = COM_ATTRIB*BYTES_PER_FLOAT
|
|
90 |
|
|
91 |
private const val TRAN_SIZE = TRAN_ATTRIBS*BYTES_PER_FLOAT
|
|
92 |
private const val VERT1_SIZE = VERT1_ATTRIBS*BYTES_PER_FLOAT
|
|
93 |
private const val VERT2_SIZE = VERT2_ATTRIBS*BYTES_PER_FLOAT
|
|
94 |
|
|
95 |
private val mCenterBlockIndex = IntArray(EffectQueue.MAIN_VARIANTS)
|
|
96 |
private val mAssocBlockIndex = IntArray(EffectQueue.MAIN_VARIANTS)
|
|
97 |
|
|
98 |
private const val TEX_COMP_SIZE = 5 // 5 four-byte entities inside the component
|
|
99 |
private var mStride = 0
|
|
100 |
|
|
101 |
/**
|
|
102 |
* How many mesh components are we going to need? Call before compilation of the shaders.
|
|
103 |
*/
|
|
104 |
@JvmStatic
|
|
105 |
var maxEffComponents: Int = 100
|
|
106 |
|
|
107 |
///////////////////////////////////////////////////////////////////////////////////////////////////
|
|
108 |
/**
|
|
109 |
* Are we going to need per-component centers (needed for correct postprocessing of concave meshes)
|
|
110 |
* Switching this on allocates 16*MAX_EFFECT_COMPONENTS bytes for uniforms in the vertex shader.
|
|
111 |
*/
|
|
112 |
@JvmStatic
|
|
113 |
var useCenters: Boolean = false
|
|
114 |
|
|
115 |
///////////////////////////////////////////////////////////////////////////////////////////////////
|
|
116 |
@JvmStatic
|
|
117 |
fun getUniforms(programH: Int, variant: Int)
|
|
118 |
{
|
|
119 |
mCenterBlockIndex[variant] = GLES30.glGetUniformBlockIndex(programH, "componentCenter")
|
|
120 |
mAssocBlockIndex[variant] = GLES30.glGetUniformBlockIndex(programH, "componentAssociation")
|
|
121 |
|
|
122 |
if (mStride==0)
|
|
123 |
{
|
|
124 |
val uniformNames = arrayOf("vComAssoc")
|
|
125 |
val indices = IntArray(1)
|
|
126 |
val params = IntArray(1)
|
|
127 |
|
|
128 |
GLES30.glGetUniformIndices(programH, uniformNames, indices, 0)
|
|
129 |
GLES30.glGetActiveUniformsiv(programH, 1, indices, 0, GLES30.GL_UNIFORM_ARRAY_STRIDE, params, 0)
|
|
130 |
|
|
131 |
mStride = params[0]/4
|
|
132 |
}
|
|
133 |
}
|
|
134 |
}
|
|
135 |
|
| 64 |
136 |
private class TexComponent
|
| 65 |
137 |
{
|
| 66 |
138 |
var mEndIndex: Int
|
| ... | ... | |
| 322 |
394 |
var mesh: MeshBase
|
| 323 |
395 |
var comp: TexComponent
|
| 324 |
396 |
val numMeshes = meshes.size
|
| 325 |
|
var numVertices: Int
|
| 326 |
397 |
var origVertices = this.numVertices
|
| 327 |
398 |
val origTexComponents: Int
|
| 328 |
399 |
var numTexComponents: Int
|
| ... | ... | |
| 507 |
578 |
}
|
| 508 |
579 |
|
| 509 |
580 |
if (immediateJoin) joinAttribs(meshes)
|
| 510 |
|
else mJobNode[0] = DeferredJobs.join(this, meshes)
|
|
581 |
else mJobNode[0] = DeferredJobs.join(this, meshes as Array<MeshBase>)
|
| 511 |
582 |
}
|
| 512 |
583 |
|
| 513 |
584 |
///////////////////////////////////////////////////////////////////////////////////////////////////
|
| ... | ... | |
| 749 |
820 |
}
|
| 750 |
821 |
|
| 751 |
822 |
///////////////////////////////////////////////////////////////////////////////////////////////////
|
| 752 |
|
val tFO: Int
|
| 753 |
|
/**
|
| 754 |
|
* Not part of public API, do not document (public only because has to be used from the main package)
|
| 755 |
|
*
|
| 756 |
|
* @y.exclude
|
| 757 |
|
*/
|
| 758 |
|
get()
|
| 759 |
|
= mTFO.createImmediatelyFloat(numVertices*TRAN_SIZE, null)
|
| 760 |
|
|
| 761 |
|
///////////////////////////////////////////////////////////////////////////////////////////////////
|
|
823 |
val tFO: Int get() = mTFO.createImmediatelyFloat(numVertices*TRAN_SIZE, null)
|
| 762 |
824 |
|
| 763 |
825 |
///////////////////////////////////////////////////////////////////////////////////////////////////
|
| 764 |
|
/**
|
| 765 |
|
* Not part of public API, do not document (public only because has to be used from the main package)
|
| 766 |
|
*
|
| 767 |
|
* @y.exclude
|
| 768 |
|
*/
|
| 769 |
826 |
fun send(programH: Int, variant: Int)
|
| 770 |
827 |
{
|
| 771 |
828 |
if (!mStrideCorrected)
|
| ... | ... | |
| 787 |
844 |
}
|
| 788 |
845 |
|
| 789 |
846 |
///////////////////////////////////////////////////////////////////////////////////////////////////
|
| 790 |
|
/**
|
| 791 |
|
* Not part of public API, do not document (public only because has to be used from the main package)
|
| 792 |
|
*
|
| 793 |
|
* @y.exclude
|
| 794 |
|
*/
|
| 795 |
847 |
fun bindVertexAttribs(program: DistortedProgram)
|
| 796 |
848 |
{
|
| 797 |
849 |
if (mJobNode[0]!=null) mJobNode[0]!!.execute() // this will set itself to null
|
| ... | ... | |
| 854 |
906 |
}
|
| 855 |
907 |
|
| 856 |
908 |
///////////////////////////////////////////////////////////////////////////////////////////////////
|
| 857 |
|
/**
|
| 858 |
|
* Not part of public API, do not document (public only because has to be used from the main package)
|
| 859 |
|
*
|
| 860 |
|
* @y.exclude
|
| 861 |
|
*/
|
| 862 |
909 |
fun bindTransformAttribs(program: DistortedProgram)
|
| 863 |
910 |
{
|
| 864 |
911 |
val index = mTFO.createImmediatelyFloat(numVertices*TRAN_SIZE, null)
|
| ... | ... | |
| 868 |
915 |
GLES30.glBindBuffer(GLES30.GL_ARRAY_BUFFER, 0)
|
| 869 |
916 |
}
|
| 870 |
917 |
|
| 871 |
|
///////////////////////////////////////////////////////////////////////////////////////////////////
|
| 872 |
|
|
| 873 |
|
///////////////////////////////////////////////////////////////////////////////////////////////////
|
| 874 |
|
|
| 875 |
918 |
///////////////////////////////////////////////////////////////////////////////////////////////////
|
| 876 |
919 |
// Return the number of bytes read.
|
| 877 |
920 |
fun read(stream: DataInputStream): Int
|
| ... | ... | |
| 1027 |
1070 |
}
|
| 1028 |
1071 |
|
| 1029 |
1072 |
///////////////////////////////////////////////////////////////////////////////////////////////////
|
| 1030 |
|
/**
|
| 1031 |
|
* @y.exclude
|
| 1032 |
|
*/
|
| 1033 |
1073 |
fun getLastVertexEff(effComponent: Int): Int
|
| 1034 |
1074 |
{
|
| 1035 |
1075 |
if (effComponent>=0&&effComponent<mTexComponent!!.size)
|
| ... | ... | |
| 1041 |
1081 |
}
|
| 1042 |
1082 |
|
| 1043 |
1083 |
///////////////////////////////////////////////////////////////////////////////////////////////////
|
| 1044 |
|
/**
|
| 1045 |
|
* @y.exclude
|
| 1046 |
|
*/
|
| 1047 |
1084 |
fun getLastVertexTex(texComponent: Int): Int
|
| 1048 |
1085 |
{
|
| 1049 |
1086 |
if (texComponent>=0&&texComponent<mTexComponent!!.size)
|
| ... | ... | |
| 1113 |
1150 |
}
|
| 1114 |
1151 |
}
|
| 1115 |
1152 |
|
| 1116 |
|
///////////////////////////////////////////////////////////////////////////////////////////////////
|
| 1117 |
|
|
| 1118 |
|
///////////////////////////////////////////////////////////////////////////////////////////////////
|
| 1119 |
|
|
| 1120 |
1153 |
///////////////////////////////////////////////////////////////////////////////////////////////////
|
| 1121 |
1154 |
/**
|
| 1122 |
1155 |
* Merge all texture components of this Mesh into a single one.
|
| ... | ... | |
| 1148 |
1181 |
mJobNode[0] = DeferredJobs.mergeEff(this)
|
| 1149 |
1182 |
}
|
| 1150 |
1183 |
}
|
|
1184 |
///////////////////////////////////////////////////////////////////////////////////////////////////
|
|
1185 |
/**
|
|
1186 |
* Return the number of vertices in this Mesh.
|
|
1187 |
*/
|
|
1188 |
fun getNumVertices() = numVertices
|
| 1151 |
1189 |
|
| 1152 |
1190 |
///////////////////////////////////////////////////////////////////////////////////////////////////
|
| 1153 |
1191 |
/**
|
| ... | ... | |
| 1173 |
1211 |
/**
|
| 1174 |
1212 |
* Apply a Matrix Effect to the components which match the (addAssoc,equAssoc) association.
|
| 1175 |
1213 |
*
|
| 1176 |
|
*
|
| 1177 |
1214 |
* This is a static, permanent modification of the vertices contained in this Mesh. If the effect
|
| 1178 |
1215 |
* contains any Dynamics, they will be evaluated at 0.
|
| 1179 |
1216 |
*
|
| ... | ... | |
| 1197 |
1234 |
/**
|
| 1198 |
1235 |
* Apply a Vertex Effect to the vertex mesh.
|
| 1199 |
1236 |
*
|
| 1200 |
|
*
|
| 1201 |
1237 |
* This is a static, permanent modification of the vertices contained in this Mesh. If the effects
|
| 1202 |
1238 |
* contain any Dynamics, the Dynamics will be evaluated at 0.
|
| 1203 |
1239 |
* We would call this several times building up a list of Effects to do. This list of effects gets
|
| ... | ... | |
| 1214 |
1250 |
/**
|
| 1215 |
1251 |
* Sets texture maps for (some of) the components of this mesh.
|
| 1216 |
1252 |
*
|
| 1217 |
|
*
|
| 1218 |
1253 |
* Format: ( x of lower-left corner, y of lower-left corner, width, height ).
|
| 1219 |
1254 |
* For example maps[0] = new Static4D( 0.0, 0.5, 0.5, 0.5 ) sets the 0th component texture map to the
|
| 1220 |
1255 |
* upper-left quadrant of the texture.
|
| 1221 |
1256 |
*
|
| 1222 |
|
*
|
| 1223 |
1257 |
* Probably the most common user case would be sending as many maps as there are components in this
|
| 1224 |
1258 |
* Mesh. One can also send less, or more (the extraneous ones will be ignored) and set some of them
|
| 1225 |
1259 |
* to null (those will be ignored as well). So if there are 5 components, and we want to set the map
|
| ... | ... | |
| 1268 |
1302 |
* The point: this way we can configure the system so that each Vertex Effect acts only on a certain
|
| 1269 |
1303 |
* subset of a Mesh, thus potentially significantly reducing the number of render calls.
|
| 1270 |
1304 |
*
|
| 1271 |
|
*
|
| 1272 |
1305 |
* Only the bottom 31 bits of the 'andAssociation' are possible, the top one is taken by Postprocessing
|
| 1273 |
1306 |
* Association [i.e. marking which components are disabled when we postprocess]
|
| 1274 |
1307 |
*/
|
| 1275 |
1308 |
fun setEffectAssociation(component: Int, andAssociation: Int, equAssociation: Int)
|
| 1276 |
1309 |
{
|
| 1277 |
|
if (component>=0&&component<maxEffComponents)
|
|
1310 |
if( component in 0..<maxEffComponents )
|
| 1278 |
1311 |
{
|
| 1279 |
1312 |
if (mJobNode[0]==null)
|
| 1280 |
1313 |
{
|
| ... | ... | |
| 1320 |
1353 |
*/
|
| 1321 |
1354 |
fun setComponentCenter(component: Int, centerX: Float, centerY: Float, centerZ: Float)
|
| 1322 |
1355 |
{
|
| 1323 |
|
if (component>=0&&component<maxEffComponents)
|
|
1356 |
if( component in 0..<maxEffComponents )
|
| 1324 |
1357 |
{
|
| 1325 |
1358 |
if (mJobNode[0]==null)
|
| 1326 |
1359 |
{
|
| ... | ... | |
| 1367 |
1400 |
}
|
| 1368 |
1401 |
|
| 1369 |
1402 |
///////////////////////////////////////////////////////////////////////////////////////////////////
|
| 1370 |
|
val numTexComponents: Int
|
| 1371 |
|
/**
|
| 1372 |
|
* Return the number of texture components, i.e. individual subsets of the whole set of vertices
|
| 1373 |
|
* which can be independently textured.
|
| 1374 |
|
*
|
| 1375 |
|
* @return The number of Texture Components of this Mesh.
|
| 1376 |
|
*/
|
| 1377 |
|
get()
|
| 1378 |
|
= mTexComponent!!.size
|
|
1403 |
/**
|
|
1404 |
* Return the number of texture components, i.e. individual subsets of the whole set of vertices
|
|
1405 |
* which can be independently textured.
|
|
1406 |
*
|
|
1407 |
* @return The number of Texture Components of this Mesh.
|
|
1408 |
*/
|
|
1409 |
val numTexComponents: Int get() = mTexComponent!!.size
|
| 1379 |
1410 |
|
| 1380 |
1411 |
///////////////////////////////////////////////////////////////////////////////////////////////////
|
| 1381 |
|
val numEffComponents: Int
|
| 1382 |
|
/**
|
| 1383 |
|
* Return the number of 'effect' components, i.e. individual subsets of the whole set of vertices
|
| 1384 |
|
* to which a VertexEffect can be addressed, independently of other vertices.
|
| 1385 |
|
*
|
| 1386 |
|
* @return The number of Effect Components of this Mesh.
|
| 1387 |
|
*/
|
| 1388 |
|
get()
|
| 1389 |
|
= mEffComponent!!.size
|
|
1412 |
/**
|
|
1413 |
* Return the number of 'effect' components, i.e. individual subsets of the whole set of vertices
|
|
1414 |
* to which a VertexEffect can be addressed, independently of other vertices.
|
|
1415 |
*
|
|
1416 |
* @return The number of Effect Components of this Mesh.
|
|
1417 |
*/
|
|
1418 |
val numEffComponents: Int get() = mEffComponent!!.size
|
| 1390 |
1419 |
|
| 1391 |
1420 |
///////////////////////////////////////////////////////////////////////////////////////////////////
|
| 1392 |
1421 |
/**
|
| ... | ... | |
| 1397 |
1426 |
* coordinates and effect associations, is always deep copied)
|
| 1398 |
1427 |
*/
|
| 1399 |
1428 |
abstract fun copy(deep: Boolean): MeshBase
|
| 1400 |
|
|
| 1401 |
|
companion object
|
| 1402 |
|
{
|
| 1403 |
|
private const val ASSOC_UBO_BINDING = 3
|
| 1404 |
|
private const val CENTER_UBO_BINDING = 4
|
| 1405 |
|
|
| 1406 |
|
// sizes of attributes of an individual vertex.
|
| 1407 |
|
private const val POS_DATA_SIZE = 3 // vertex coordinates: x,y,z
|
| 1408 |
|
private const val NOR_DATA_SIZE = 3 // normal vector: x,y,z
|
| 1409 |
|
private const val TEX_DATA_SIZE = 2 // texture coordinates: s,t
|
| 1410 |
|
private const val COM_DATA_SIZE = 1 // component number, a single float
|
| 1411 |
|
|
| 1412 |
|
const val POS_ATTRIB: Int = 0
|
| 1413 |
|
const val NOR_ATTRIB: Int = POS_DATA_SIZE
|
| 1414 |
|
const val TEX_ATTRIB: Int = 0
|
| 1415 |
|
const val COM_ATTRIB: Int = TEX_DATA_SIZE
|
| 1416 |
|
|
| 1417 |
|
const val VERT1_ATTRIBS: Int = POS_DATA_SIZE+NOR_DATA_SIZE // number of attributes of a vertex (the part changed by preapply)
|
| 1418 |
|
const val VERT2_ATTRIBS: Int = TEX_DATA_SIZE+COM_DATA_SIZE // number of attributes of a vertex (the 'preapply invariant' part)
|
| 1419 |
|
const val TRAN_ATTRIBS: Int = POS_DATA_SIZE+NOR_DATA_SIZE // number of attributes of a transform feedback vertex
|
| 1420 |
|
|
| 1421 |
|
private const val BYTES_PER_FLOAT = 4
|
| 1422 |
|
|
| 1423 |
|
private const val OFFSET_POS = POS_ATTRIB*BYTES_PER_FLOAT
|
| 1424 |
|
private const val OFFSET_NOR = NOR_ATTRIB*BYTES_PER_FLOAT
|
| 1425 |
|
private const val OFFSET_TEX = TEX_ATTRIB*BYTES_PER_FLOAT
|
| 1426 |
|
private const val OFFSET_COM = COM_ATTRIB*BYTES_PER_FLOAT
|
| 1427 |
|
|
| 1428 |
|
private const val TRAN_SIZE = TRAN_ATTRIBS*BYTES_PER_FLOAT
|
| 1429 |
|
private const val VERT1_SIZE = VERT1_ATTRIBS*BYTES_PER_FLOAT
|
| 1430 |
|
private const val VERT2_SIZE = VERT2_ATTRIBS*BYTES_PER_FLOAT
|
| 1431 |
|
|
| 1432 |
|
private val mCenterBlockIndex = IntArray(EffectQueue.MAIN_VARIANTS)
|
| 1433 |
|
private val mAssocBlockIndex = IntArray(EffectQueue.MAIN_VARIANTS)
|
| 1434 |
|
|
| 1435 |
|
private const val TEX_COMP_SIZE = 5 // 5 four-byte entities inside the component
|
| 1436 |
|
|
| 1437 |
|
/**
|
| 1438 |
|
* Are we using per-component centers?
|
| 1439 |
|
*/
|
| 1440 |
|
var useCenters: Boolean = false
|
| 1441 |
|
private set
|
| 1442 |
|
private var mStride = 0
|
| 1443 |
|
|
| 1444 |
|
/**
|
| 1445 |
|
* How many mesh components are we going to need? Call before compilation of the shaders.
|
| 1446 |
|
*/
|
| 1447 |
|
///////////////////////////////////////////////////////////////////////////////////////////////////
|
| 1448 |
|
var maxEffComponents: Int = 100
|
| 1449 |
|
|
| 1450 |
|
///////////////////////////////////////////////////////////////////////////////////////////////////
|
| 1451 |
|
/**
|
| 1452 |
|
* Are we going to need per-component centers (needed for correct postprocessing of concave meshes)
|
| 1453 |
|
* Switching this on allocates 16*MAX_EFFECT_COMPONENTS bytes for uniforms in the vertex shader.
|
| 1454 |
|
*/
|
| 1455 |
|
fun setUseCenters()
|
| 1456 |
|
{
|
| 1457 |
|
useCenters = true
|
| 1458 |
|
}
|
| 1459 |
|
|
| 1460 |
|
///////////////////////////////////////////////////////////////////////////////////////////////////
|
| 1461 |
|
|
| 1462 |
|
///////////////////////////////////////////////////////////////////////////////////////////////////
|
| 1463 |
|
|
| 1464 |
|
///////////////////////////////////////////////////////////////////////////////////////////////////
|
| 1465 |
|
@JvmStatic
|
| 1466 |
|
fun getUniforms(programH: Int, variant: Int)
|
| 1467 |
|
{
|
| 1468 |
|
mCenterBlockIndex[variant] = GLES30.glGetUniformBlockIndex(programH, "componentCenter")
|
| 1469 |
|
mAssocBlockIndex[variant] = GLES30.glGetUniformBlockIndex(programH, "componentAssociation")
|
| 1470 |
|
|
| 1471 |
|
if (mStride==0)
|
| 1472 |
|
{
|
| 1473 |
|
val uniformNames = arrayOf("vComAssoc")
|
| 1474 |
|
val indices = IntArray(1)
|
| 1475 |
|
val params = IntArray(1)
|
| 1476 |
|
|
| 1477 |
|
GLES30.glGetUniformIndices(programH, uniformNames, indices, 0)
|
| 1478 |
|
GLES30.glGetActiveUniformsiv(programH, 1, indices, 0, GLES30.GL_UNIFORM_ARRAY_STRIDE, params, 0)
|
| 1479 |
|
|
| 1480 |
|
mStride = params[0]/4
|
| 1481 |
|
}
|
| 1482 |
|
}
|
| 1483 |
|
}
|
| 1484 |
1429 |
}
|
transition of the mesh package.
Compiles, but does not work.