1 package jarmos.geometry;
8 import java.io.BufferedReader;
9 import java.io.IOException;
10 import java.util.List;
42 private int[] domain_of_face;
70 private boolean is2D =
true;
75 public float[]
nminmax = { 1e9f, 1e9f, 1e9f, -1e9f, -1e9f, -1e9f };
90 private int numOrigVertices;
101 @SuppressWarnings(
"unused")
102 private
int subdomains;
112 private
float[][] vertices = null;
125 Log.d(
"GeoData",
"Adding displacements from " + d.descriptor +
", numVertices=" + numOrigVertices
126 +
", vertices field length=" + vertices.length +
", displacement field size=" + d.getSize() +
" (x3="
127 + d.getSize() * 3 +
"), parts=" + parts);
128 for (
int vset = 0; vset < parts; vset++) {
129 for (
int nodenr = 0; nodenr < numOrigVertices; nodenr++) {
130 int idx = vset * numOrigVertices + nodenr;
131 vertices[vset][3 * nodenr] += d.getXDisplacements()[idx] / scaling;
132 vertices[vset][3 * nodenr + 1] += d.getYDisplacements()[idx] / scaling;
133 vertices[vset][3 * nodenr + 2] += d.getZDisplacements()[idx] / scaling;
136 compute3DNormalData();
137 centerModelGeometry();
143 private void centerModelGeometry() {
144 computeBoundingBox();
148 for (
int vset = 0; vset < vertices.length; vset++) {
149 for (
int i = 0; i < vertices[vset].length / 3; i++) {
150 vertices[vset][i * 3 + 0] -= xcen;
151 vertices[vset][i * 3 + 1] -= ycen;
152 vertices[vset][i * 3 + 2] -= zcen;
167 private void compute3DNormalData() {
168 normal =
new float[vertices.length][];
169 fnormal =
new float[vertices.length][];
170 for (
int vset = 0; vset < vertices.length; vset++) {
171 float[] normal_ =
new float[numOrigVertices * 3];
172 float[] fnormal_ =
new float[
numFaces * 3];
173 float[] vecAB =
new float[3];
174 float[] vecAC =
new float[3];
178 int[] icount =
new int[numOrigVertices];
179 for (i = 0; i < numOrigVertices; i++) {
180 normal_[i * 3 + 0] = 0.0f;
181 normal_[i * 3 + 1] = 0.0f;
182 normal_[i * 3 + 2] = 0.0f;
187 for (j = 0; j < 3; j++) {
188 vecAB[j] = vertices[vset][
faces[i * 3 + 1] * 3 + j] - vertices[vset][
faces[i * 3 + 0] * 3 + j];
189 vecAC[j] = vertices[vset][faces[i * 3 + 2] * 3 + j] - vertices[vset][faces[i * 3 + 0] * 3 + j];
192 fnormal_[i * 3 + 0] = vecAB[1] * vecAC[2] - vecAB[2] * vecAC[1];
193 fnormal_[i * 3 + 1] = vecAB[2] * vecAC[0] - vecAB[0] * vecAC[2];
194 fnormal_[i * 3 + 2] = vecAB[0] * vecAC[1] - vecAB[1] * vecAC[0];
196 length = (float) Math.sqrt((fnormal_[i * 3 + 0] * fnormal_[i * 3 + 0] + fnormal_[i * 3 + 1]
197 * fnormal_[i * 3 + 1] + fnormal_[i * 3 + 2] * fnormal_[i * 3 + 2]));
198 for (j = 0; j < 3; j++)
199 fnormal_[i * 3 + j] = fnormal_[i * 3 + j] / length;
201 for (j = 0; j < 3; j++) {
202 icount[
faces[i * 3 + j]]++;
203 for (k = 0; k < 3; k++)
204 normal_[faces[i * 3 + j] * 3 + k] += fnormal_[i * 3 + k];
208 for (i = 0; i < numOrigVertices; i++) {
209 for (j = 0; j < 3; j++)
210 normal_[i * 3 + j] = normal_[i * 3 + j] / icount[i];
211 length = (float) Math.sqrt((normal_[i * 3 + 0] * normal_[i * 3 + 0] + normal_[i * 3 + 1]
212 * normal_[i * 3 + 1] + normal_[i * 3 + 2] * normal_[i * 3 + 2]));
213 for (j = 0; j < 3; j++)
214 normal_[i * 3 + j] = normal_[i * 3 + j] / length;
224 private void computeBoundingBox() {
231 for (
int vset = 0; vset < vertices.length; vset++) {
232 for (
int i = 0; i < vertices[vset].length / 3; i++) {
233 for (
int j = 0; j < 3; j++) {
234 nminmax[0 + j] = (
nminmax[0 + j] > vertices[vset][i * 3 + j]) ? vertices[vset][i * 3 + j]
236 nminmax[3 + j] = (
nminmax[3 + j] < vertices[vset][i * 3 + j]) ? vertices[vset][i * 3 + j]
254 public void createMesh(List<MeshTransform> transforms,
boolean update) {
255 vertices =
new float[transforms.size()][];
270 compute3DNormalData();
272 centerModelGeometry();
282 return numOrigVertices;
302 private void loadGeometry(
AModelManager m)
throws IOException {
306 Log.d(
"GeoData",
"Loaded " + originalVertices.length +
" vertex values");
312 if (
"2".equals(m.getModelXMLTagValue(
"geometry.dimension"))) {
314 float[] tmpnode =
new float[originalVertices.length + originalVertices.length / 2];
315 for (
int i = 0; i < originalVertices.length / 2; i++) {
318 tmpnode[3 * i + 2] = 0;
322 Log.d(
"GeoData",
"2D geometry - extending vertex data to 3rd dimension (zeros) to total number of "
323 + originalVertices.length +
" values");
326 numOrigVertices = originalVertices.length / 3;
327 Log.d(
"GeoData",
"Loaded " + numOrigVertices +
" vertices");
332 if (m.modelFileExists(
"faces.bin")
334 || m.xmlTagExists(
"geometry.hasFaces")
335 && Boolean.parseBoolean(m.getModelXMLTagValue(
"geometry.hasFaces"))) {
336 faces = mr.readRawShortVector(m.getInStream(
"faces.bin"));
339 for (
int i = 0; i < faces.length; i++) {
343 numFaces = faces.length / 3;
344 Log.d(
"GeoData",
"Loaded " + numFaces +
" faces");
349 if (m.modelFileExists(
"edges.bin")) {
350 edges = mr.readRawShortVector(m.getInStream(
"edges.bin"));
372 loadrbappmitGeometry(m);
374 Log.e(
"GeometryData",
"Unknown model type '" + m.getModelType() +
"' for use with GeometryData");
377 }
catch (IOException e) {
378 Log.e(
"GeometryData",
"Loading model geometry failed: " + e.getMessage(), e);
386 for (
int i = 0; i <
numFaces; i++) {
403 private void loadrbappmitGeometry(
AModelManager m)
throws IOException {
404 String[] tokens = null;
405 BufferedReader reader = m.getBufReader(
"geometry.dat");
407 tokens = reader.readLine().split(
" ");
415 numOrigVertices = Integer.parseInt(tokens[0]);
418 for (
int i = 0; i < numOrigVertices; i++) {
421 originalVertices[i * 3 + 2] = Float.parseFloat(tokens[count + 2]);
426 for (
int i = 0; i < numOrigVertices; i++) {
433 subdomains = Integer.parseInt(tokens[count]);
434 numFaces = Integer.parseInt(tokens[count + 1]);
436 faces =
new short[numFaces * 3];
437 for (
int i = 0; i <
numFaces; i++) {
438 faces[i * 3 + 0] = Short.parseShort(tokens[count]);
439 faces[i * 3 + 1] = Short.parseShort(tokens[count + 1]);
440 faces[i * 3 + 2] = Short.parseShort(tokens[count + 2]);
447 vertexLTFuncNr =
new int[numOrigVertices];
448 for (
int i = 0; i < numOrigVertices; i++) {
449 vertexLTFuncNr[i] = Integer.parseInt(tokens[count]);
453 for (
int i = 0; i <
numFaces; i++) {
454 domain_of_face[i] = Integer.parseInt(tokens[count]);
short[] faceWireframe
Faces edge/wireframe data.
The displacement field is a logical solution field describing displacements of geometry nodes/vertice...
float[][] fnormal
For 3D geometry this contains the face normal data (three coordinates (x,y,z) per face) ...
float[] nminmax
the bounding box (xyz range) of the model
An rbappmit-model of old data format, compatible with JRB models.
Reading matrices and vectors with a bunch of convenient overloads for different sources and output fo...
boolean loadModelGeometry(AModelManager m)
Reads the geometry data for the current model using the ModelManager.
Known model types within the JaRMoSBase project.
This class serves as base class for accessing various types of models at different locations...
int numFaces
Number of faces.
ModelType getModelType()
Returns the model type as given in the model.xml attribute "type" of the "model" tag.
Provides a Log class imitating the Android Log class when not used on android systems.
This is a container class for all geometry-related data of a reduced model.
void addDisplacements(DisplacementField d, int parts)
Sets the displacement data for this geometry according to the DisplacementField provided.
float[] originalVertices
The reference nodes.
float[][] normal
For 3D geometry this contains the local node normal data (three coordinates (x,y,z) per node) ...
int[] vertexLTFuncNr
tell us which subdomain our vertices belong to
void createMesh(List< MeshTransform > transforms, boolean update)
Transforms the original vertices by all given MeshTransforms in the list and concatenates the results...
int getNumVertices()
The number of (original) vertices of the geometry.