Skip to content

Commit f5333a2

Browse files
authored
Merge pull request #59 from 06wj/master
Update library for Hilo3d and glTF Loader
2 parents 2d27f4b + d0f408c commit f5333a2

File tree

6 files changed

+553
-8
lines changed

6 files changed

+553
-8
lines changed

examples/Hilo3d/index.html

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,10 +13,10 @@
1313
</head>
1414
<body>
1515
<!-- Hilo3d.js -->
16-
<script src="../../libs/Hilo3d/1.11.6/Hilo3d.js"></script>
17-
<script src="../../libs/Hilo3d/1.11.6/OrbitControls.js"></script>
18-
<script src="../../libs/Hilo3d/1.11.6/draco_decoder.js"></script>
19-
<script src="../../libs/Hilo3d/1.11.6/DracoLoader.js"></script>
16+
<script src="../../libs/Hilo3d/1.11.17/Hilo3d.js"></script>
17+
<script src="../../libs/Hilo3d/1.11.17/OrbitControls.js"></script>
18+
<script src="../../libs/Hilo3d/1.11.17/draco_decoder.js"></script>
19+
<script src="../../libs/Hilo3d/1.11.17/DracoLoader.js"></script>
2020
<!-- dat.gui.js -->
2121
<script src="../../libs/common/dat.gui.js"></script>
2222

examples/Hilo3d/index.js

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -67,10 +67,6 @@ var directionLight = new Hilo3d.DirectionalLight({
6767
direction:new Hilo3d.Vector3(1, -1, 0)
6868
}).addTo(stage);
6969

70-
var ambientLight = new Hilo3d.AmbientLight({
71-
color:new Hilo3d.Color(1, 1, 1),
72-
amount: .2
73-
}).addTo(stage);
7470

7571
var ticker = new Hilo3d.Ticker(60);
7672
ticker.addTick(stage);
@@ -174,12 +170,16 @@ guiSkybox.onChange(function (value) {
174170
material.brdfLUT = brfdTexture;
175171
material.diffuseEnvMap = diffuseEnvMap;
176172
material.specularEnvMap = specularEnvMap;
173+
directionLight.enabled = true;
174+
material.isDirty = true;
177175
});
178176
} else {
179177
model.materials.forEach(function (material) {
180178
material.brdfLUT = null;
181179
material.diffuseEnvMap = null;
182180
material.specularEnvMap = null;
181+
directionLight.enabled = false;
182+
material.isDirty = true;
183183
});
184184
}
185185
});

libs/Hilo3d/1.11.17/DracoLoader.js

Lines changed: 184 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,184 @@
1+
(function() {
2+
var Class = Hilo3d.Class;
3+
var BasicLoader = Hilo3d.BasicLoader;
4+
var Geometry = Hilo3d.Geometry;
5+
var GeometryData = Hilo3d.GeometryData;
6+
7+
var dracoDecoder = window.dracoDecoder = new DracoDecoderModule();
8+
dracoDecoder.onModuleLoaded = function(module) {
9+
dracoDecoder = module;
10+
}
11+
12+
function getAttributeData(decoder, dracoGeometry, attribute) {
13+
if (attribute.ptr === 0) {
14+
return null;
15+
}
16+
17+
var numComponents = attribute.num_components();
18+
var attributeData = new dracoDecoder.DracoFloat32Array();
19+
20+
decoder.GetAttributeFloatForAllPoints(dracoGeometry, attribute, attributeData);
21+
var numPoints = dracoGeometry.num_points();
22+
var numValues = numPoints * numComponents;
23+
var result = new Float32Array(numValues);
24+
for (var i = 0; i < numValues; i++) {
25+
result[i] = attributeData.GetValue(i);
26+
}
27+
return result;
28+
}
29+
30+
function decode(byteArray, info, primitive) {
31+
var attributesMap = info.attributes;
32+
var buffer = new dracoDecoder.DecoderBuffer();
33+
buffer.Init(byteArray, byteArray.byteLength);
34+
var decoder = new dracoDecoder.Decoder();
35+
36+
var geometryType = decoder.GetEncodedGeometryType(buffer);
37+
var dracoGeometry, decodingStatus;
38+
if (geometryType == dracoDecoder.TRIANGULAR_MESH) {
39+
dracoGeometry = new dracoDecoder.Mesh();
40+
decodingStatus = decoder.DecodeBufferToMesh(buffer, dracoGeometry);
41+
} else {
42+
dracoGeometry = new dracoDecoder.PointCloud();
43+
decodingStatus = decoder.DecodeBufferToPointCloud(buffer, dracoGeometry);
44+
}
45+
46+
if (!decodingStatus.ok() || dracoGeometry.ptr == 0) {
47+
console.error('decodingStatus error');
48+
return;
49+
}
50+
dracoDecoder.destroy(buffer);
51+
52+
var geometry = primitive._geometry || new Geometry();
53+
54+
var numFaces = dracoGeometry.num_faces();
55+
var numPoints = dracoGeometry.num_points();
56+
// Verify if there is position attribute.
57+
var posAttId = decoder.GetAttributeId(dracoGeometry,
58+
dracoDecoder.POSITION);
59+
if (posAttId == -1) {
60+
var errorMsg = 'THREE.DRACOLoader: No position attribute found.';
61+
console.error(errorMsg);
62+
dracoDecoder.destroy(decoder);
63+
dracoDecoder.destroy(dracoGeometry);
64+
throw new Error(errorMsg);
65+
}
66+
var posAttribute = decoder.GetAttribute(dracoGeometry, posAttId);
67+
var posTransform = new dracoDecoder.AttributeQuantizationTransform();
68+
if (posTransform.InitFromAttribute(posAttribute)) {
69+
70+
}
71+
72+
var dracoAttributesMap = {
73+
POSITION: ['vertices', 3],
74+
NORMAL: ['normals', 3],
75+
TANGENT: ['tangents', 4],
76+
TEX_COORD: ['uvs', 2],
77+
TEXCOORD_0: ['uvs', 2],
78+
TEXCOORD_1: ['uvs1', 2],
79+
COLOR: ['color', 2],
80+
COLOR_0: ['color', 2],
81+
JOINTS_0: ['skinIndices', 4],
82+
WEIGHTS_0: ['skinWeights', 4],
83+
};
84+
85+
var attributeUsedMap = {};
86+
for (var attributeName in dracoAttributesMap) {
87+
var info = dracoAttributesMap[attributeName];
88+
var attId = decoder.GetAttributeId(dracoGeometry, dracoDecoder[attributeName]);
89+
if (dracoDecoder[attributeName] !== undefined && attId !== -1) {
90+
var attribute = decoder.GetAttribute(dracoGeometry, attId);
91+
var data = getAttributeData(decoder, dracoGeometry, attribute);
92+
if (data) {
93+
geometry[info[0]] = new GeometryData(data, info[1]);
94+
}
95+
attributeUsedMap[info[0]] = true;
96+
}
97+
}
98+
99+
for (var attributeName in attributesMap) {
100+
var info = dracoAttributesMap[attributeName];
101+
if (!info) {
102+
console.warn(attributeName + ' not exist');
103+
continue;
104+
}
105+
if (attributeUsedMap[info[0]]) {
106+
continue;
107+
}
108+
var attributeId = attributesMap[attributeName];
109+
var attribute = decoder.GetAttributeByUniqueId(dracoGeometry,
110+
attributeId);
111+
var data = getAttributeData(decoder, dracoGeometry, attribute);
112+
if (data) {
113+
geometry[info[0]] = new GeometryData(data, info[1]);
114+
}
115+
}
116+
117+
if (geometry._tangents) {
118+
if (geometry._tangents.length > geometry.vertices.length) {
119+
geometry._tangents.stride = 16;
120+
geometry._tangents.size = 3;
121+
}
122+
}
123+
124+
if (geometry.skinIndices) {
125+
var x = geometry.skinIndices.data;
126+
for (var i = x.length - 1; i >= 0; i--) {
127+
x[i] = Math.round(x[i]);
128+
}
129+
}
130+
131+
var indicesArray;
132+
if (numPoints > 65535) {
133+
indicesArray = new Uint32Array(numFaces * 3);
134+
} else {
135+
indicesArray = new Uint16Array(numFaces * 3);
136+
}
137+
var ia = new dracoDecoder.DracoInt32Array();
138+
for (var i = 0; i < numFaces; i++) {
139+
decoder.GetFaceFromMesh(dracoGeometry, i, ia);
140+
var idx = i * 3;
141+
indicesArray[idx] = ia.GetValue(0);
142+
indicesArray[idx + 1] = ia.GetValue(1);
143+
indicesArray[idx + 2] = ia.GetValue(2);
144+
}
145+
geometry.indices = new GeometryData(indicesArray, 1);
146+
147+
dracoDecoder.destroy(ia);
148+
dracoDecoder.destroy(dracoGeometry);
149+
dracoDecoder.destroy(decoder);
150+
return geometry;
151+
}
152+
153+
154+
var DracoLoader = Class.create({
155+
Extends: BasicLoader,
156+
Statics: {
157+
decode: decode
158+
},
159+
constructor: function() {
160+
DracoLoader.superclass.constructor.call(this);
161+
},
162+
load: function(params) {
163+
return this.loadRes(params.src, 'buffer')
164+
.then(function(data) {
165+
return decode(data);
166+
}).catch(function(err) {
167+
console.warn('load draco failed', err);
168+
throw err;
169+
});
170+
}
171+
});
172+
173+
Hilo3d.DracoLoader = DracoLoader;
174+
Hilo3d.Loader.addLoader('drc', DracoLoader);
175+
176+
Hilo3d.GLTFParser.extensionHandlers.KHR_draco_mesh_compression = {
177+
parse: function(info, parser, result, primitive) {
178+
var bufferView = parser.bufferViews[info.bufferView];
179+
var uintArray = new Uint8Array(bufferView.buffer, bufferView.byteOffset, bufferView.byteLength);
180+
var geometry = decode(uintArray, info, primitive);
181+
return geometry;
182+
}
183+
};
184+
})();

libs/Hilo3d/1.11.17/Hilo3d.js

Lines changed: 39 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)