diff --git a/examples/webgl_collada.html b/examples/webgl_collada.html index 9fe68ca8..bfe76cc7 100644 --- a/examples/webgl_collada.html +++ b/examples/webgl_collada.html @@ -217,7 +217,7 @@ var timer = new Date().getTime() * 0.0005; camera.position.x = Math.cos( timer ) * 10; - camera.position.y = 20; + camera.position.y = 2; camera.position.z = Math.sin( timer ) * 10; for ( var i = 0, l = objects.length; i < l; i++ ) { diff --git a/src/extras/collada/dae.js b/src/extras/collada/dae.js index a9f66ae7..9984d0a2 100644 --- a/src/extras/collada/dae.js +++ b/src/extras/collada/dae.js @@ -11,6 +11,7 @@ var DAE = (function() { var effects = {}; var visualScenes; var readyCallbackFunc = null; + var baseUrl; function load(url, readyCallback) { if (document.implementation && document.implementation.createDocument) { @@ -33,7 +34,7 @@ var DAE = (function() { if(req.status == 0 || req.status == 200) { readyCallbackFunc = readyCallback; - parse(req.responseXML); + parse(req.responseXML, undefined, url); } } } @@ -44,10 +45,14 @@ var DAE = (function() { } } - function parse(doc, callBack) { + function parse(doc, callBack, url) { COLLADA = doc; callBack = callBack || readyCallbackFunc; - + if (url !== undefined) { + var parts = url.split('/'); + parts.pop(); + baseUrl = parts.join('/') + '/'; + } images = parseLib("//dae:library_images/dae:image", _Image, "image"); materials = parseLib("//dae:library_materials/dae:material", Material, "material"); effects = parseLib("//dae:library_effects/dae:effect", Effect, "effect"); @@ -218,8 +223,7 @@ var DAE = (function() { var symbol = inst_material.symbol; var effect_id = materials[target].instance_effect.url; var effect = effects[effect_id]; - var shader = effect.shader; - shaders[symbol] = shader; + shaders[symbol] = effect; } } @@ -234,15 +238,27 @@ var DAE = (function() { var primitives = geometry.mesh.primitives; for (j = 0; j < primitives.length; j++) { var symbol = primitives[j].material; - var shader = shaders[symbol]; + var effect = shaders[symbol]; + var shader = effect.shader; var ambient = shader.ambient ? shader.ambient.color : 0x505050; var diffuse = shader.diffuse ? shader.diffuse.color : 0xff0000; var specular = shader.specular ? shader.specular.color : null; var transparency = shader.transparency; var use_transparency = (transparency !== undefined && transparency < 1.0); var opacity = use_transparency ? transparency : 1.0; - + var texture; + + if (shader.diffuse && shader.diffuse.isTexture() && effect.sampler && effect.surface) { + if (effect.sampler.source == effect.surface.sid) { + var image = images[effect.surface.init_from]; + if (image) { + texture = THREE.ImageUtils.loadTexture(baseUrl + image.init_from); + } + } + } + var mat = new THREE.MeshLambertMaterial( { + map: texture, color: diffuse.hex, opacity: opacity, transparent: use_transparency, @@ -250,6 +266,7 @@ var DAE = (function() { if (shader.type != 'lambert' && shader.shininess && specular && ambient) { mat = new THREE.MeshPhongMaterial( { + map: texture, ambient: ambient.hex, color: diffuse.hex, specular: specular.hex, @@ -1047,8 +1064,8 @@ var DAE = (function() { this.color.a = rgba[3]; break; case 'texture': - //this.texture = child.getAttribute('texture'); - //this.texcoord = child.getAttribute('texcoord'); + this.texture = child.getAttribute('texture'); + this.texcoord = child.getAttribute('texcoord'); break; default: break; @@ -1086,22 +1103,136 @@ var DAE = (function() { return this; } + function Surface(effect) { + this.effect = effect; + this.init_from; + this.format; + } + Surface.prototype.parse = function(element) { + for (var i = 0; i < element.childNodes.length; i++) { + var child = element.childNodes[i]; + if (child.nodeType != 1) continue; + switch (child.nodeName) { + case 'init_from': + this.init_from = child.textContent; + break; + case 'format': + this.format = child.textContent; + break; + default: + console.log("unhandled Surface prop: " + child.nodeName); + break; + } + } + return this; + } + function Sampler2D(effect) { + this.effect = effect; + this.source; + this.wrap_s; + this.wrap_t; + this.minfilter; + this.magfilter; + this.mipfilter; + } + Sampler2D.prototype.parse = function(element) { + for (var i = 0; i < element.childNodes.length; i++) { + var child = element.childNodes[i]; + if (child.nodeType != 1) continue; + switch (child.nodeName) { + case 'source': + this.source = child.textContent; + break; + case 'minfilter': + this.minfilter = child.textContent; + break; + case 'magfilter': + this.magfilter = child.textContent; + break; + case 'mipfilter': + this.mipfilter = child.textContent; + break; + case 'wrap_s': + this.wrap_s = child.textContent; + break; + case 'wrap_t': + this.wrap_t = child.textContent; + break; + default: + console.log("unhandled Sampler2D prop: " + child.nodeName); + break; + } + } + return this; + } + function Effect() { this.id = ""; this.name = ""; this.shader = null; + this.surface; + this.sampler; } Effect.prototype.parse = function(element) { this.id = element.getAttribute('id'); this.name = element.getAttribute('name'); - var technique = COLLADA.evaluate(".//dae:technique", - element, - _nsResolver, - XPathResult.ORDERED_NODE_ITERATOR_TYPE, - null).iterateNext(); - if (!technique) return null; - for (var i = 0; i < technique.childNodes.length; i++) { - var child = technique.childNodes[i]; + + for (var i = 0; i < element.childNodes.length; i++) { + var child = element.childNodes[i]; + if (child.nodeType != 1) continue; + switch (child.nodeName) { + case 'profile_COMMON': + this.parseProfileCOMMON(child); + break; + default: + break; + } + } + return this; + } + Effect.prototype.parseNewparam = function(element) { + var sid = element.getAttribute('sid'); + for (var i = 0; i < element.childNodes.length; i++) { + var child = element.childNodes[i]; + if (child.nodeType != 1) continue; + switch (child.nodeName) { + case 'surface': + this.surface = (new Surface(this)).parse(child); + this.surface.sid = sid; + break; + case 'sampler2D': + this.sampler = (new Sampler2D(this)).parse(child); + this.sampler.sid = sid; + break; + default: + console.log(child.nodeName); + break; + } + } + } + Effect.prototype.parseProfileCOMMON = function(element) { + for (var i = 0; i < element.childNodes.length; i++) { + var child = element.childNodes[i]; + if (child.nodeType != 1) continue; + switch (child.nodeName) { + case 'profile_COMMON': + this.parseProfileCOMMON(child); + break; + case 'technique': + this.parseTechnique(child); + break; + case 'newparam': + this.parseNewparam(child); + break; + default: + console.log(child.nodeName); + break; + } + } + } + Effect.prototype.parseTechnique= function(element) { + for (var i = 0; i < element.childNodes.length; i++) { + var child = element.childNodes[i]; if (child.nodeType != 1) continue; switch (child.nodeName) { case 'lambert': @@ -1113,7 +1244,6 @@ var DAE = (function() { break; } } - return this; } function InstanceEffect() {