Skip to content

Commit 8dd829d

Browse files
authored
Merge pull request #2144 from riccardobl/deprecatetbn
Deprecate TangentBinormalGenerator
2 parents fc32a26 + 32d37ef commit 8dd829d

28 files changed

+270
-227
lines changed

jme3-core/src/main/java/com/jme3/util/TangentBinormalGenerator.java

+13-132
Original file line numberDiff line numberDiff line change
@@ -59,9 +59,11 @@
5959
import java.util.logging.Logger;
6060

6161
/**
62-
*
62+
* @deprecated This is an outdated and non-standard method. Please use @{link MikktspaceTangentGenerator}
63+
* instead.
6364
* @author Lex (Aleksey Nikiforov)
6465
*/
66+
@Deprecated
6567
public class TangentBinormalGenerator {
6668

6769
private static final Logger log = Logger.getLogger(TangentBinormalGenerator.class.getName());
@@ -860,142 +862,21 @@ private static int parity(Vector3f n1, Vector3f n) {
860862
}
861863
}
862864

865+
/**
866+
* @deprecated Use {@link TangentUtils#genTbnLines(com.jme3.scene.Mesh, float) } instead.
867+
*/
868+
@Deprecated
863869
public static Mesh genTbnLines(Mesh mesh, float scale) {
864-
if (mesh.getBuffer(Type.Tangent) == null) {
865-
return genNormalLines(mesh, scale);
866-
} else {
867-
return genTangentLines(mesh, scale);
868-
}
870+
return TangentUtils.genTbnLines(mesh, scale);
869871
}
870872

873+
/**
874+
* @deprecated Use {@link TangentUtils#genNormalLines(com.jme3.scene.Mesh, float) } instead.
875+
*/
876+
@Deprecated
871877
public static Mesh genNormalLines(Mesh mesh, float scale) {
872-
FloatBuffer vertexBuffer = (FloatBuffer) mesh.getBuffer(Type.Position).getData();
873-
FloatBuffer normalBuffer = (FloatBuffer) mesh.getBuffer(Type.Normal).getData();
874-
875-
ColorRGBA originColor = ColorRGBA.White;
876-
ColorRGBA normalColor = ColorRGBA.Blue;
877-
878-
Mesh lineMesh = new Mesh();
879-
lineMesh.setMode(Mesh.Mode.Lines);
880-
881-
Vector3f origin = new Vector3f();
882-
Vector3f point = new Vector3f();
883-
884-
FloatBuffer lineVertex = BufferUtils.createFloatBuffer(vertexBuffer.limit() * 2);
885-
FloatBuffer lineColor = BufferUtils.createFloatBuffer(vertexBuffer.limit() / 3 * 4 * 2);
886-
887-
for (int i = 0; i < vertexBuffer.limit() / 3; i++) {
888-
populateFromBuffer(origin, vertexBuffer, i);
889-
populateFromBuffer(point, normalBuffer, i);
890-
891-
int index = i * 2;
892-
893-
setInBuffer(origin, lineVertex, index);
894-
setInBuffer(originColor, lineColor, index);
895-
896-
point.multLocal(scale);
897-
point.addLocal(origin);
898-
setInBuffer(point, lineVertex, index + 1);
899-
setInBuffer(normalColor, lineColor, index + 1);
900-
}
901-
902-
lineMesh.setBuffer(Type.Position, 3, lineVertex);
903-
lineMesh.setBuffer(Type.Color, 4, lineColor);
904-
905-
lineMesh.setStatic();
906-
//lineMesh.setInterleaved();
907-
return lineMesh;
878+
return TangentUtils.genNormalLines(mesh, scale);
908879
}
909880

910-
private static Mesh genTangentLines(Mesh mesh, float scale) {
911-
FloatBuffer vertexBuffer = (FloatBuffer) mesh.getBuffer(Type.Position).getData();
912-
FloatBuffer normalBuffer = (FloatBuffer) mesh.getBuffer(Type.Normal).getData();
913-
FloatBuffer tangentBuffer = (FloatBuffer) mesh.getBuffer(Type.Tangent).getData();
914-
915-
FloatBuffer binormalBuffer = null;
916-
if (mesh.getBuffer(Type.Binormal) != null) {
917-
binormalBuffer = (FloatBuffer) mesh.getBuffer(Type.Binormal).getData();
918-
}
919-
920-
ColorRGBA originColor = ColorRGBA.White;
921-
ColorRGBA tangentColor = ColorRGBA.Red;
922-
ColorRGBA binormalColor = ColorRGBA.Green;
923-
ColorRGBA normalColor = ColorRGBA.Blue;
924-
925-
Mesh lineMesh = new Mesh();
926-
lineMesh.setMode(Mesh.Mode.Lines);
927-
928-
Vector3f origin = new Vector3f();
929-
Vector3f point = new Vector3f();
930-
Vector3f tangent = new Vector3f();
931-
Vector3f normal = new Vector3f();
932881

933-
IntBuffer lineIndex = BufferUtils.createIntBuffer(vertexBuffer.limit() / 3 * 6);
934-
FloatBuffer lineVertex = BufferUtils.createFloatBuffer(vertexBuffer.limit() * 4);
935-
FloatBuffer lineColor = BufferUtils.createFloatBuffer(vertexBuffer.limit() / 3 * 4 * 4);
936-
937-
boolean hasParity = mesh.getBuffer(Type.Tangent).getNumComponents() == 4;
938-
float tangentW = 1;
939-
940-
for (int i = 0; i < vertexBuffer.limit() / 3; i++) {
941-
populateFromBuffer(origin, vertexBuffer, i);
942-
populateFromBuffer(normal, normalBuffer, i);
943-
944-
if (hasParity) {
945-
tangent.x = tangentBuffer.get(i * 4);
946-
tangent.y = tangentBuffer.get(i * 4 + 1);
947-
tangent.z = tangentBuffer.get(i * 4 + 2);
948-
tangentW = tangentBuffer.get(i * 4 + 3);
949-
} else {
950-
populateFromBuffer(tangent, tangentBuffer, i);
951-
}
952-
953-
int index = i * 4;
954-
955-
int id = i * 6;
956-
lineIndex.put(id, index);
957-
lineIndex.put(id + 1, index + 1);
958-
lineIndex.put(id + 2, index);
959-
lineIndex.put(id + 3, index + 2);
960-
lineIndex.put(id + 4, index);
961-
lineIndex.put(id + 5, index + 3);
962-
963-
setInBuffer(origin, lineVertex, index);
964-
setInBuffer(originColor, lineColor, index);
965-
966-
point.set(tangent);
967-
point.multLocal(scale);
968-
point.addLocal(origin);
969-
setInBuffer(point, lineVertex, index + 1);
970-
setInBuffer(tangentColor, lineColor, index + 1);
971-
972-
// wvBinormal = cross(wvNormal, wvTangent) * -inTangent.w
973-
if (binormalBuffer == null) {
974-
normal.cross(tangent, point);
975-
point.multLocal(-tangentW);
976-
point.normalizeLocal();
977-
} else {
978-
populateFromBuffer(point, binormalBuffer, i);
979-
}
980-
981-
point.multLocal(scale);
982-
point.addLocal(origin);
983-
setInBuffer(point, lineVertex, index + 2);
984-
setInBuffer(binormalColor, lineColor, index + 2);
985-
986-
point.set(normal);
987-
point.multLocal(scale);
988-
point.addLocal(origin);
989-
setInBuffer(point, lineVertex, index + 3);
990-
setInBuffer(normalColor, lineColor, index + 3);
991-
}
992-
993-
lineMesh.setBuffer(Type.Index, 1, lineIndex);
994-
lineMesh.setBuffer(Type.Position, 3, lineVertex);
995-
lineMesh.setBuffer(Type.Color, 4, lineColor);
996-
997-
lineMesh.setStatic();
998-
//lineMesh.setInterleaved();
999-
return lineMesh;
1000-
}
1001882
}

jme3-core/src/main/java/com/jme3/util/TangentUtils.java

+148
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,16 @@
3131
*/
3232
package com.jme3.util;
3333

34+
import static com.jme3.util.BufferUtils.populateFromBuffer;
35+
import static com.jme3.util.BufferUtils.setInBuffer;
36+
37+
import java.nio.FloatBuffer;
38+
import java.nio.IntBuffer;
39+
40+
import com.jme3.math.ColorRGBA;
41+
import com.jme3.math.Vector3f;
3442
import com.jme3.scene.*;
43+
import com.jme3.scene.VertexBuffer.Type;
3544

3645
/**
3746
* Created by Nehon on 03/10/2016.
@@ -63,4 +72,143 @@ public static void generateBindPoseTangentsIfNecessary(Mesh mesh){
6372
}
6473
}
6574
}
75+
76+
public static Mesh genTbnLines(Mesh mesh, float scale) {
77+
if (mesh.getBuffer(Type.Tangent) == null) {
78+
return genNormalLines(mesh, scale);
79+
} else {
80+
return genTangentLines(mesh, scale);
81+
}
82+
}
83+
84+
public static Mesh genNormalLines(Mesh mesh, float scale) {
85+
FloatBuffer vertexBuffer = (FloatBuffer) mesh.getBuffer(Type.Position).getData();
86+
FloatBuffer normalBuffer = (FloatBuffer) mesh.getBuffer(Type.Normal).getData();
87+
88+
ColorRGBA originColor = ColorRGBA.White;
89+
ColorRGBA normalColor = ColorRGBA.Blue;
90+
91+
Mesh lineMesh = new Mesh();
92+
lineMesh.setMode(Mesh.Mode.Lines);
93+
94+
Vector3f origin = new Vector3f();
95+
Vector3f point = new Vector3f();
96+
97+
FloatBuffer lineVertex = BufferUtils.createFloatBuffer(vertexBuffer.limit() * 2);
98+
FloatBuffer lineColor = BufferUtils.createFloatBuffer(vertexBuffer.limit() / 3 * 4 * 2);
99+
100+
for (int i = 0; i < vertexBuffer.limit() / 3; i++) {
101+
populateFromBuffer(origin, vertexBuffer, i);
102+
populateFromBuffer(point, normalBuffer, i);
103+
104+
int index = i * 2;
105+
106+
setInBuffer(origin, lineVertex, index);
107+
setInBuffer(originColor, lineColor, index);
108+
109+
point.multLocal(scale);
110+
point.addLocal(origin);
111+
setInBuffer(point, lineVertex, index + 1);
112+
setInBuffer(normalColor, lineColor, index + 1);
113+
}
114+
115+
lineMesh.setBuffer(Type.Position, 3, lineVertex);
116+
lineMesh.setBuffer(Type.Color, 4, lineColor);
117+
118+
lineMesh.setStatic();
119+
// lineMesh.setInterleaved();
120+
return lineMesh;
121+
}
122+
123+
public static Mesh genTangentLines(Mesh mesh, float scale) {
124+
FloatBuffer vertexBuffer = (FloatBuffer) mesh.getBuffer(Type.Position).getData();
125+
FloatBuffer normalBuffer = (FloatBuffer) mesh.getBuffer(Type.Normal).getData();
126+
FloatBuffer tangentBuffer = (FloatBuffer) mesh.getBuffer(Type.Tangent).getData();
127+
128+
FloatBuffer binormalBuffer = null;
129+
if (mesh.getBuffer(Type.Binormal) != null) {
130+
binormalBuffer = (FloatBuffer) mesh.getBuffer(Type.Binormal).getData();
131+
}
132+
133+
ColorRGBA originColor = ColorRGBA.White;
134+
ColorRGBA tangentColor = ColorRGBA.Red;
135+
ColorRGBA binormalColor = ColorRGBA.Green;
136+
ColorRGBA normalColor = ColorRGBA.Blue;
137+
138+
Mesh lineMesh = new Mesh();
139+
lineMesh.setMode(Mesh.Mode.Lines);
140+
141+
Vector3f origin = new Vector3f();
142+
Vector3f point = new Vector3f();
143+
Vector3f tangent = new Vector3f();
144+
Vector3f normal = new Vector3f();
145+
146+
IntBuffer lineIndex = BufferUtils.createIntBuffer(vertexBuffer.limit() / 3 * 6);
147+
FloatBuffer lineVertex = BufferUtils.createFloatBuffer(vertexBuffer.limit() * 4);
148+
FloatBuffer lineColor = BufferUtils.createFloatBuffer(vertexBuffer.limit() / 3 * 4 * 4);
149+
150+
boolean hasParity = mesh.getBuffer(Type.Tangent).getNumComponents() == 4;
151+
float tangentW = 1;
152+
153+
for (int i = 0; i < vertexBuffer.limit() / 3; i++) {
154+
populateFromBuffer(origin, vertexBuffer, i);
155+
populateFromBuffer(normal, normalBuffer, i);
156+
157+
if (hasParity) {
158+
tangent.x = tangentBuffer.get(i * 4);
159+
tangent.y = tangentBuffer.get(i * 4 + 1);
160+
tangent.z = tangentBuffer.get(i * 4 + 2);
161+
tangentW = tangentBuffer.get(i * 4 + 3);
162+
} else {
163+
populateFromBuffer(tangent, tangentBuffer, i);
164+
}
165+
166+
int index = i * 4;
167+
168+
int id = i * 6;
169+
lineIndex.put(id, index);
170+
lineIndex.put(id + 1, index + 1);
171+
lineIndex.put(id + 2, index);
172+
lineIndex.put(id + 3, index + 2);
173+
lineIndex.put(id + 4, index);
174+
lineIndex.put(id + 5, index + 3);
175+
176+
setInBuffer(origin, lineVertex, index);
177+
setInBuffer(originColor, lineColor, index);
178+
179+
point.set(tangent);
180+
point.multLocal(scale);
181+
point.addLocal(origin);
182+
setInBuffer(point, lineVertex, index + 1);
183+
setInBuffer(tangentColor, lineColor, index + 1);
184+
185+
// wvBinormal = cross(wvNormal, wvTangent) * -inTangent.w
186+
if (binormalBuffer == null) {
187+
normal.cross(tangent, point);
188+
point.multLocal(-tangentW);
189+
point.normalizeLocal();
190+
} else {
191+
populateFromBuffer(point, binormalBuffer, i);
192+
}
193+
194+
point.multLocal(scale);
195+
point.addLocal(origin);
196+
setInBuffer(point, lineVertex, index + 2);
197+
setInBuffer(binormalColor, lineColor, index + 2);
198+
199+
point.set(normal);
200+
point.multLocal(scale);
201+
point.addLocal(origin);
202+
setInBuffer(point, lineVertex, index + 3);
203+
setInBuffer(normalColor, lineColor, index + 3);
204+
}
205+
206+
lineMesh.setBuffer(Type.Index, 1, lineIndex);
207+
lineMesh.setBuffer(Type.Position, 3, lineVertex);
208+
lineMesh.setBuffer(Type.Color, 4, lineColor);
209+
210+
lineMesh.setStatic();
211+
// lineMesh.setInterleaved();
212+
return lineMesh;
213+
}
66214
}

0 commit comments

Comments
 (0)