collada textures

This commit is contained in:
timk
2011-08-14 19:35:23 +02:00
parent 0a11f631b1
commit 2c133f00c6
2 changed files with 149 additions and 19 deletions
+1 -1
View File
@@ -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++ ) {
+148 -18
View File
@@ -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() {