Skip to content

Commit a3340ec

Browse files
committed
feat: expand attribute scheme to allow combining meshdata
1 parent 89d45ce commit a3340ec

File tree

3 files changed

+164
-1
lines changed

3 files changed

+164
-1
lines changed
Lines changed: 110 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,110 @@
1+
// Copyright 2021 The Terasology Foundation
2+
// SPDX-License-Identifier: Apache-2.0
3+
4+
package org.terasology.engine.rendering.assets.mesh;
5+
6+
import org.joml.Matrix4f;
7+
import org.joml.Vector3f;
8+
import org.junit.jupiter.api.Test;
9+
import org.terasology.joml.test.VectorAssert;
10+
import org.terasology.nui.Color;
11+
12+
import static org.junit.jupiter.api.Assertions.assertEquals;
13+
14+
public class StandardMeshDataTest {
15+
16+
@Test
17+
public void combineStandardMeshData() {
18+
StandardMeshData m1 = new StandardMeshData();
19+
m1.position.put(new Vector3f(10f, 10f, 10f));
20+
m1.position.put(new Vector3f(15f, 20f, 10f));
21+
m1.position.put(new Vector3f(10f, 30f, 10f));
22+
23+
StandardMeshData m2 = new StandardMeshData();
24+
m2.position.put(new Vector3f(10f, 10f, 10f));
25+
m2.position.put(new Vector3f(15f, 20f, 10f));
26+
m2.position.put(new Vector3f(10f, 30f, 10f));
27+
28+
m1.combine(new Matrix4f(), m2);
29+
30+
assertEquals(m1.position.getPosition(), 6);
31+
assertEquals(m1.normal.getPosition(), 0);
32+
assertEquals(m1.uv0.getPosition(), 0);
33+
assertEquals(m1.uv1.getPosition(), 0);
34+
assertEquals(m1.color0.getPosition(), 0);
35+
36+
VectorAssert.assertEquals(m1.position.get(0, new Vector3f()), new Vector3f(10f, 10f, 10f), .001f);
37+
VectorAssert.assertEquals(m1.position.get(1, new Vector3f()), new Vector3f(15f, 20f, 10f), .001f);
38+
VectorAssert.assertEquals(m1.position.get(2, new Vector3f()), new Vector3f(10f, 30f, 10f), .001f);
39+
40+
VectorAssert.assertEquals(m1.position.get(3, new Vector3f()), new Vector3f(10f, 10f, 10f), .001f);
41+
VectorAssert.assertEquals(m1.position.get(4, new Vector3f()), new Vector3f(15f, 20f, 10f), .001f);
42+
VectorAssert.assertEquals(m1.position.get(5, new Vector3f()), new Vector3f(10f, 30f, 10f), .001f);
43+
44+
}
45+
46+
@Test
47+
public void combineStandardMeshDataWithTransform() {
48+
StandardMeshData m1 = new StandardMeshData();
49+
m1.position.put(new Vector3f(-1f, 1f, 0f));
50+
m1.position.put(new Vector3f(1f, 1f, 0f));
51+
m1.position.put(new Vector3f(1f, -1f, 0f));
52+
m1.position.put(new Vector3f(-1f, -1f, 0f));
53+
54+
StandardMeshData m2 = new StandardMeshData();
55+
m2.position.put(new Vector3f(-1f, 1f, 0f));
56+
m2.position.put(new Vector3f(1f, 1f, 0f));
57+
m2.position.put(new Vector3f(1f, -1f, 0f));
58+
m2.position.put(new Vector3f(-1f, -1f, 0f));
59+
60+
m1.combine(new Matrix4f().translate(10f,0,0), m2);
61+
62+
VectorAssert.assertEquals(m1.position.get(0, new Vector3f()), new Vector3f(-1f, 1f, 0f), .001f);
63+
VectorAssert.assertEquals(m1.position.get(1, new Vector3f()), new Vector3f(1f, 1f, 0f), .001f);
64+
VectorAssert.assertEquals(m1.position.get(2, new Vector3f()), new Vector3f(1f, -1f, 0f), .001f);
65+
VectorAssert.assertEquals(m1.position.get(3, new Vector3f()), new Vector3f(-1f, -1f, 0f), .001f);
66+
67+
VectorAssert.assertEquals(m1.position.get(4, new Vector3f()), new Vector3f(9f, 1f, 0), .001f);
68+
VectorAssert.assertEquals(m1.position.get(5, new Vector3f()), new Vector3f(11f, 1f, 0), .001f);
69+
VectorAssert.assertEquals(m1.position.get(6, new Vector3f()), new Vector3f(11f, -1f, 0), .001f);
70+
VectorAssert.assertEquals(m1.position.get(7, new Vector3f()), new Vector3f(9f, -1f, 0), .001f);
71+
}
72+
73+
@Test
74+
public void secondMeshWithColorCombineStandardMeshData() {
75+
StandardMeshData m1 = new StandardMeshData();
76+
m1.position.put(new Vector3f(10f, 10f, 10f));
77+
m1.position.put(new Vector3f(15f, 20f, 10f));
78+
m1.position.put(new Vector3f(10f, 30f, 10f));
79+
80+
StandardMeshData m2 = new StandardMeshData();
81+
m2.position.put(new Vector3f(10f, 10f, 10f));
82+
m2.position.put(new Vector3f(15f, 20f, 10f));
83+
m2.position.put(new Vector3f(10f, 30f, 10f));
84+
m2.color0.put(Color.blue);
85+
m2.color0.put(Color.blue);
86+
m2.color0.put(Color.blue);
87+
88+
m1.combine(new Matrix4f(), m2);
89+
90+
assertEquals(m1.position.getPosition(), 6);
91+
assertEquals(m1.color0.getPosition(), 6);
92+
assertEquals(m1.normal.getPosition(), 0);
93+
assertEquals(m1.uv0.getPosition(), 0);
94+
assertEquals(m1.uv1.getPosition(), 0);
95+
96+
VectorAssert.assertEquals(m1.position.get(0, new Vector3f()), new Vector3f(10f, 10f, 10f), .001f);
97+
VectorAssert.assertEquals(m1.position.get(1, new Vector3f()), new Vector3f(15f, 20f, 10f), .001f);
98+
VectorAssert.assertEquals(m1.position.get(2, new Vector3f()), new Vector3f(10f, 30f, 10f), .001f);
99+
assertEquals(m1.color0.get(0, new Color()), new Color(Color.black));
100+
assertEquals(m1.color0.get(1, new Color()), new Color(Color.black));
101+
assertEquals(m1.color0.get(2, new Color()), new Color(Color.black));
102+
103+
VectorAssert.assertEquals(m1.position.get(3, new Vector3f()), new Vector3f(10f, 10f, 10f), .001f);
104+
VectorAssert.assertEquals(m1.position.get(4, new Vector3f()), new Vector3f(15f, 20f, 10f), .001f);
105+
VectorAssert.assertEquals(m1.position.get(5, new Vector3f()), new Vector3f(10f, 30f, 10f), .001f);
106+
assertEquals(m1.color0.get(3, new Color()), new Color(Color.blue));
107+
assertEquals(m1.color0.get(4, new Color()), new Color(Color.blue));
108+
assertEquals(m1.color0.get(5, new Color()), new Color(Color.blue));
109+
}
110+
}

engine/src/main/java/org/terasology/engine/rendering/assets/mesh/StandardMeshData.java

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33

44
package org.terasology.engine.rendering.assets.mesh;
55

6+
import org.joml.Matrix4f;
67
import org.joml.Vector2f;
78
import org.joml.Vector2fc;
89
import org.joml.Vector3f;
@@ -123,6 +124,39 @@ public void reallocate(int numVerts, int numIndices) {
123124
indices.allocateElements(numIndices);
124125
}
125126

127+
128+
/**
129+
* append mesh data to current mesh
130+
* @param transform transformation to apply to target
131+
* @param target target mesh
132+
*/
133+
public void combine(Matrix4f transform, StandardMeshData target) {
134+
int start = this.position.getPosition();
135+
if (!position.isEmpty() || !target.position.isEmpty()) {
136+
position.setPosition(start);
137+
Vector3f temp = new Vector3f();
138+
for (int i = 0; i < target.position.elements(); i++) {
139+
this.position.put(transform.transformPosition(target.position.get(i, temp)));
140+
}
141+
}
142+
if (!normal.isEmpty() || !target.normal.isEmpty()) {
143+
VertexAttributeBinding.copy(target.normal, start, this.normal, new Vector3f());
144+
}
145+
if (!uv0.isEmpty() || !target.uv0.isEmpty()) {
146+
VertexAttributeBinding.copy(target.uv0, start, this.uv0, new Vector2f());
147+
}
148+
if (!uv1.isEmpty() || !target.uv1.isEmpty()) {
149+
VertexAttributeBinding.copy(target.uv1, start, this.uv1, new Vector2f());
150+
}
151+
if (!color0.isEmpty() || !target.color0.isEmpty()) {
152+
VertexAttributeBinding.copy(target.color0, start, this.color0, new Color());
153+
}
154+
if (!light0.isEmpty() || !target.light0.isEmpty()) {
155+
VertexAttributeBinding.copy(target.light0, start, this.light0, new Vector3f());
156+
}
157+
}
158+
159+
126160
@Override
127161
public VertexAttributeBinding<Vector3fc, Vector3f> positions() {
128162
return position;

engine/src/main/java/org/terasology/engine/rendering/assets/mesh/resource/VertexAttributeBinding.java

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,11 +16,14 @@ public VertexAttributeBinding(VertexResource resource, int offset, VertexAttribu
1616
this.attribute = attribute;
1717
}
1818

19-
2019
public int elements() {
2120
return getResource().elements();
2221
}
2322

23+
public boolean isEmpty() {
24+
return getResource().isEmpty();
25+
}
26+
2427
@Override
2528
public void reserve(int vertCount) {
2629
resource.reserveElements(vertCount);
@@ -32,6 +35,22 @@ public void allocate(int elements) {
3235
resource.mark();
3336
}
3437

38+
/**
39+
*
40+
* @param from data getting copied from
41+
* @param position position to start copying to dest
42+
* @param dest the destination to fill
43+
* @param target a temporary object to transfer data between from and dest
44+
* @param <T>
45+
* @param <I>
46+
*/
47+
public static <T,I extends T> void copy(VertexAttributeBinding<T, I> from, int position, VertexAttributeBinding<T, I> dest, I target) {
48+
dest.setPosition(position);
49+
for (int i = 0; i < from.elements(); i++) {
50+
dest.put(from.get(i, target));
51+
}
52+
}
53+
3554
/**
3655
* write a value by the index.
3756
*

0 commit comments

Comments
 (0)