1
1
/*
2
- * Copyright (c) 2023 , Peter Abeles. All Rights Reserved.
2
+ * Copyright (c) 2024 , Peter Abeles. All Rights Reserved.
3
3
*
4
4
* This file is part of BoofCV (http://boofcv.org).
5
5
*
21
21
import boofcv .alg .cloud .PointCloudReader ;
22
22
import boofcv .alg .cloud .PointCloudWriter ;
23
23
import boofcv .struct .mesh .VertexMesh ;
24
+ import georegression .struct .point .Point2D_F32 ;
25
+ import georegression .struct .point .Point3D_F32 ;
24
26
import georegression .struct .point .Point3D_F64 ;
25
27
import org .ddogleg .struct .DogArray_I32 ;
26
28
@@ -62,15 +64,36 @@ public static void save( VertexMesh mesh, Writer writer ) throws IOException {
62
64
obj .addVertex (p .x , p .y , p .z );
63
65
}
64
66
67
+ // Save vertex normals
68
+ for (int i = 0 ; i < mesh .normals .size (); i ++) {
69
+ Point3D_F32 p = mesh .normals .getTemp (i );
70
+ obj .addVertex (p .x , p .y , p .z );
71
+ }
72
+
73
+ // Save vertex textures
74
+ for (int i = 0 ; i < mesh .texture .size (); i ++) {
75
+ Point2D_F32 p = mesh .texture .getTemp (i );
76
+ obj .addTextureVertex (p .x , p .y );
77
+ }
78
+
79
+ // See how many different types of vertexes need to be saved
80
+ int count = 0 ;
81
+ if (mesh .vertexes .size () > 0 )
82
+ count ++;
83
+ if (mesh .normals .size () > 0 )
84
+ count ++;
85
+ if (mesh .texture .size () > 0 )
86
+ count ++;
87
+
65
88
// Create the faces
66
89
var indexes = new DogArray_I32 ();
67
- for (int i = 1 ; i < mesh .offsets .size ; i ++) {
68
- int idx0 = mesh .offsets .get (i - 1 );
69
- int idx1 = mesh .offsets .get (i );
90
+ for (int i = 1 ; i < mesh .faceOffsets .size ; i ++) {
91
+ int idx0 = mesh .faceOffsets .get (i - 1 );
92
+ int idx1 = mesh .faceOffsets .get (i );
70
93
71
94
indexes .reset ();
72
- indexes .addAll (mesh .indexes .data , idx0 , idx1 );
73
- obj .addFace (indexes );
95
+ indexes .addAll (mesh .faceVertexes .data , idx0 , idx1 );
96
+ obj .addFace (indexes , count );
74
97
}
75
98
}
76
99
@@ -79,9 +102,16 @@ public static void load( InputStream input, PointCloudWriter output ) throws IOE
79
102
@ Override protected void addVertex ( double x , double y , double z ) {
80
103
output .add (x , y , z , 0 );
81
104
}
105
+
106
+ @ Override protected void addVertexNormal ( double x , double y , double z ) {}
107
+
108
+ @ Override protected void addVertexTexture ( double x , double y ) {}
109
+
82
110
@ Override protected void addPoint ( int vertex ) {}
111
+
83
112
@ Override protected void addLine ( DogArray_I32 vertexes ) {}
84
- @ Override protected void addFace ( DogArray_I32 vertexes ) {}
113
+
114
+ @ Override protected void addFace ( DogArray_I32 indexes , int vertexCount ) {}
85
115
};
86
116
obj .parse (new BufferedReader (new InputStreamReader (input , StandardCharsets .UTF_8 )));
87
117
}
@@ -92,11 +122,30 @@ public static void load( InputStream input, VertexMesh output ) throws IOExcepti
92
122
@ Override protected void addVertex ( double x , double y , double z ) {
93
123
output .vertexes .append (x , y , z );
94
124
}
125
+
126
+ @ Override protected void addVertexNormal ( double x , double y , double z ) {
127
+ output .normals .append ((float )x , (float )y , (float )z );
128
+ }
129
+
130
+ @ Override protected void addVertexTexture ( double x , double y ) {
131
+ output .texture .append ((float )x , (float )y );
132
+ }
133
+
95
134
@ Override protected void addPoint ( int vertex ) {}
135
+
96
136
@ Override protected void addLine ( DogArray_I32 vertexes ) {}
97
- @ Override protected void addFace ( DogArray_I32 vertexes ) {
98
- output .indexes .addAll (vertexes );
99
- output .offsets .add (output .indexes .size );
137
+
138
+ @ Override protected void addFace ( DogArray_I32 indexes , int vertexCount ) {
139
+ int types = indexes .size /vertexCount ;
140
+ for (int idxVert = 0 ; idxVert < vertexCount ; idxVert ++) {
141
+ output .faceVertexes .add (indexes .get (idxVert )/types );
142
+ for (int i = 1 ; i < types ; i ++) {
143
+ if (indexes .get (i - 1 ) != indexes .get (i ))
144
+ throw new RuntimeException ("Only vertexes types with the same index supported" );
145
+ }
146
+ }
147
+
148
+ output .faceOffsets .add (output .faceVertexes .size );
100
149
}
101
150
};
102
151
obj .parse (new BufferedReader (new InputStreamReader (input , StandardCharsets .UTF_8 )));
0 commit comments