8
8
9
9
using namespace emscripten ;
10
10
11
+ namespace detail {
12
+
13
+ // To RGBA
14
+ bool ToRGBA (const std::vector<uint8_t > &src, int channels,
15
+ std::vector<uint8_t > &dst) {
16
+
17
+ uint32_t npixels = src.size () / channels;
18
+ dst.resize (npixels * 4 );
19
+
20
+ if (channels == 1 ) { // grayscale
21
+ for (size_t i = 0 ; i < npixels; i++) {
22
+ dst[4 * i + 0 ] = src[i];
23
+ dst[4 * i + 1 ] = src[i];
24
+ dst[4 * i + 2 ] = src[i];
25
+ dst[4 * i + 3 ] = 1 .0f ;
26
+ }
27
+ } else if (channels == 2 ) { // assume luminance + alpha
28
+ for (size_t i = 0 ; i < npixels; i++) {
29
+ dst[4 * i + 0 ] = src[2 *i+0 ];
30
+ dst[4 * i + 1 ] = src[2 *i+0 ];
31
+ dst[4 * i + 2 ] = src[2 *i+0 ];
32
+ dst[4 * i + 3 ] = src[2 *i+1 ];
33
+ }
34
+ } else if (channels == 3 ) {
35
+ for (size_t i = 0 ; i < npixels; i++) {
36
+ dst[4 * i + 0 ] = src[3 *i+0 ];
37
+ dst[4 * i + 1 ] = src[3 *i+1 ];
38
+ dst[4 * i + 2 ] = src[3 *i+2 ];
39
+ dst[4 * i + 3 ] = 1 .0f ;
40
+ }
41
+ } else if (channels == 4 ) {
42
+ dst = src;
43
+ } else {
44
+ return false ;
45
+ }
46
+
47
+ return true ;
48
+ }
49
+
50
+ }
51
+
11
52
// /
12
53
// / Simple C++ wrapper class for Emscripten
13
54
// /
@@ -29,6 +70,8 @@ class TinyUSDZLoader {
29
70
30
71
tinyusdz::tydra::RenderSceneConverterEnv env (stage);
31
72
73
+ env.material_config .preserve_texel_bitdepth = true ;
74
+
32
75
if (is_usdz) {
33
76
// Setup AssetResolutionResolver to read a asset(file) from memory.
34
77
bool asset_on_memory =
@@ -69,6 +112,81 @@ class TinyUSDZLoader {
69
112
return render_scene_.meshes .size ();
70
113
}
71
114
115
+ emscripten::val getMaterial (int mat_id) const {
116
+
117
+ emscripten::val mat = emscripten::val::object ();
118
+
119
+ if (!loaded_) {
120
+ return mat;
121
+ }
122
+
123
+ if (mat_id >= render_scene_.materials .size ()) {
124
+ return mat;
125
+ }
126
+
127
+ const auto &m = render_scene_.materials [mat_id];
128
+
129
+ if (m.surfaceShader .diffuseColor .is_texture ()) {
130
+ mat.set (" diffuseColorTextureId" , m.surfaceShader .diffuseColor .texture_id );
131
+ } else {
132
+ // TODO
133
+ // mat.set("diffuseColor", m.surfaceShader.diffuseColor);
134
+ }
135
+
136
+ return mat;
137
+ }
138
+
139
+ emscripten::val getTexture (int tex_id) const {
140
+
141
+ emscripten::val tex = emscripten::val::object ();
142
+
143
+ if (!loaded_) {
144
+ return tex;
145
+ }
146
+
147
+ if (tex_id >= render_scene_.textures .size ()) {
148
+ return tex;
149
+ }
150
+
151
+ const auto &t = render_scene_.textures [tex_id];
152
+
153
+ tex.set (" textureImageId" , int (t.texture_image_id ));
154
+ // tex.set("wrapS", to_string(t.wrapS));
155
+ // tex.set("wrapT", to_string(t.wrapT));
156
+ // TOOD: bias, scale, rot/scale/trans
157
+
158
+ return tex;
159
+ }
160
+
161
+ emscripten::val getImage (int img_id) const {
162
+
163
+ emscripten::val img = emscripten::val::object ();
164
+
165
+ if (!loaded_) {
166
+ return img;
167
+ }
168
+
169
+ if (img_id >= render_scene_.images .size ()) {
170
+ return img;
171
+ }
172
+
173
+ const auto &i = render_scene_.images [img_id];
174
+
175
+ if ((i.buffer_id >= 0 ) && (i.buffer_id < render_scene_.buffers .size ())) {
176
+ const auto &b = render_scene_.buffers [i.buffer_id ];
177
+
178
+ // TODO: Support HDR
179
+
180
+ img.set (" data" , emscripten::typed_memory_view (b.data .size (), b.data .data ()));
181
+ img.set (" width" , int (i.width ));
182
+ img.set (" height" , int (i.height ));
183
+ img.set (" channels" , int (i.channels ));
184
+ }
185
+
186
+
187
+ return img;
188
+ }
189
+
72
190
emscripten::val getMesh (int mesh_id) const {
73
191
emscripten::val mesh = emscripten::val::object ();
74
192
@@ -94,6 +212,20 @@ class TinyUSDZLoader {
94
212
// vec3
95
213
mesh.set (" points" , emscripten::typed_memory_view (rmesh.points .size () * 3 , points_ptr));
96
214
215
+ {
216
+ // slot 0 hardcoded.
217
+ uint32_t uvSlotId = 0 ;
218
+ if (rmesh.texcoords .count (uvSlotId)) {
219
+ const float *uvs_ptr = reinterpret_cast <const float *>(rmesh.texcoords .at (uvSlotId).data .data ());
220
+
221
+ // assume vec2
222
+ mesh.set (" texcoords" , emscripten::typed_memory_view (rmesh.texcoords .at (uvSlotId).vertex_count () * 2 , uvs_ptr));
223
+ }
224
+ }
225
+
226
+ mesh.set (" materialId" , rmesh.material_id );
227
+
228
+
97
229
return mesh;
98
230
}
99
231
@@ -122,6 +254,9 @@ EMSCRIPTEN_BINDINGS(tinyusdz_module) {
122
254
.constructor <const std::string &>()
123
255
.function (" getMesh" , &TinyUSDZLoader::getMesh)
124
256
.function (" numMeshes" , &TinyUSDZLoader::numMeshes)
257
+ .function (" getMaterial" , &TinyUSDZLoader::getMaterial)
258
+ .function (" getTexture" , &TinyUSDZLoader::getTexture)
259
+ .function (" getImage" , &TinyUSDZLoader::getImage)
125
260
.function (" ok" , &TinyUSDZLoader::ok)
126
261
.function (" error" , &TinyUSDZLoader::error);
127
262
}
0 commit comments