current progress - starting to load textures sparse

beta.r3js.org
Theunis J. Botha 2016-11-01 18:59:26 +01:00
parent 04391a78e4
commit 9b6c5d4348
3 changed files with 465 additions and 343 deletions

View File

@ -408,6 +408,26 @@ GameLib.D3.Material = function(
} }
this.envMapIntensity = envMapIntensity; this.envMapIntensity = envMapIntensity;
/**
* @type GameLib.D3.Material.ImageLoadedCallback[]
*/
this.OnImageLoadedCallbacks = [];
};
/**
* Assigns a copy of the loaded texture map to the instance material
* @param instanceMaterial
* @param instanceMapId
* @returns {Function}
* @constructor
*/
GameLib.D3.Material.ImageLoadedCallback = function(
instanceMaterial,
instanceMapId
) {
return function(texture) {
instanceMaterial[instanceMapId] = texture.clone();
};
}; };
/** /**
@ -508,75 +528,145 @@ GameLib.D3.Material.TYPE_MULTI_MATERIAL= "MultiMaterial";
/** /**
* Creates an instance Material from a GameLib.D3.Material * Creates an instance Material from a GameLib.D3.Material
* @param gameLibMaterial GameLib.D3.Material * @param apiMaterial GameLib.D3.Material
* @param graphics GameLib.D3.Graphics * @param graphics GameLib.D3.Graphics
* @param uploadUrl String * @param imageLoader GameLib.D3.Texture
* @param progressCallback
*/ */
GameLib.D3.Material.CreateInstanceMaterial = function( GameLib.D3.Material.CreateInstanceMaterial = function(
gameLibMaterial, apiMaterial,
graphics, graphics,
uploadUrl, imageLoader
progressCallback
) { ) {
var gameLibMaterial = new GameLib.D3.Material(
var defer = Q.defer(); apiMaterial.id,
apiMaterial.name,
apiMaterial.materialType,
apiMaterial.opacity,
apiMaterial.side,
apiMaterial.transparent,
apiMaterial.maps,
new GameLib.D3.Color(
apiMaterial.specular.r,
apiMaterial.specular.g,
apiMaterial.specular.b,
apiMaterial.specular.a
),
apiMaterial.lightMapIntensity,
apiMaterial.aoMapIntensity,
new GameLib.D3.Color(
apiMaterial.color.r,
apiMaterial.color.g,
apiMaterial.color.b,
apiMaterial.color.a
),
new GameLib.D3.Color(
apiMaterial.emissive.r,
apiMaterial.emissive.g,
apiMaterial.emissive.b,
apiMaterial.emissive.a
),
apiMaterial.emissiveIntensity,
apiMaterial.combine,
apiMaterial.shininess,
apiMaterial.reflectivity,
apiMaterial.refractionRatio,
apiMaterial.fog,
apiMaterial.wireframe,
apiMaterial.wireframeLineWidth,
apiMaterial.wireframeLineCap,
apiMaterial.wireframeLineJoin,
apiMaterial.vertexColors,
apiMaterial.skinning,
apiMaterial.morphTargets,
apiMaterial.morphNormals,
apiMaterial.lineWidth,
apiMaterial.lineCap,
apiMaterial.lineJoin,
apiMaterial.dashSize,
apiMaterial.gapWidth,
apiMaterial.blending,
apiMaterial.blendSrc,
apiMaterial.blendDst,
apiMaterial.blendEquation,
apiMaterial.depthTest,
apiMaterial.depthFunc,
apiMaterial.depthWrite,
apiMaterial.polygonOffset,
apiMaterial.polygonOffsetFactor,
apiMaterial.polygonOffsetUnits,
apiMaterial.alphaTest,
apiMaterial.clippingPlanes,
apiMaterial.clipShadows,
apiMaterial.visible,
apiMaterial.overdraw,
apiMaterial.shading,
apiMaterial.bumpScale,
apiMaterial.normalScale,
apiMaterial.displacementScale,
apiMaterial.displacementBias,
apiMaterial.roughness,
apiMaterial.metalness,
apiMaterial.pointSize,
apiMaterial.pointSizeAttenuation,
apiMaterial.spriteRotation,
apiMaterial.envMapIntensity
);
var instanceMaterial = null; var instanceMaterial = null;
var blenderMaps = []; var blenderMaps = [];
if (gameLibMaterial.materialType == GameLib.D3.Material.TYPE_MESH_STANDARD) { if (apiMaterial.materialType == GameLib.D3.Material.TYPE_MESH_STANDARD) {
instanceMaterial = new graphics.instance.MeshStandardMaterial({ instanceMaterial = new graphics.instance.MeshStandardMaterial({
name: gameLibMaterial.name, name: apiMaterial.name,
opacity: gameLibMaterial.opacity, opacity: apiMaterial.opacity,
transparent: gameLibMaterial.transparent, transparent: apiMaterial.transparent,
blending: gameLibMaterial.blending, blending: apiMaterial.blending,
blendSrc: gameLibMaterial.blendSrc, blendSrc: apiMaterial.blendSrc,
blendDst: gameLibMaterial.blendDst, blendDst: apiMaterial.blendDst,
blendEquation: gameLibMaterial.blendEquation, blendEquation: apiMaterial.blendEquation,
depthTest: gameLibMaterial.depthTest, depthTest: apiMaterial.depthTest,
depthFunc: gameLibMaterial.depthFunc, depthFunc: apiMaterial.depthFunc,
depthWrite: gameLibMaterial.depthWrite, depthWrite: apiMaterial.depthWrite,
polygonOffset: gameLibMaterial.polygonOffset, polygonOffset: apiMaterial.polygonOffset,
polygonOffsetFactor: gameLibMaterial.polygonOffsetFactor, polygonOffsetFactor: apiMaterial.polygonOffsetFactor,
polygonOffsetUnits: gameLibMaterial.polygonOffsetUnits, polygonOffsetUnits: apiMaterial.polygonOffsetUnits,
alphaTest: gameLibMaterial.alphaTest, alphaTest: apiMaterial.alphaTest,
clippingPlanes: gameLibMaterial.clippingPlanes, clippingPlanes: apiMaterial.clippingPlanes,
clipShadows: gameLibMaterial.clipShadows, clipShadows: apiMaterial.clipShadows,
overdraw: gameLibMaterial.overdraw, overdraw: apiMaterial.overdraw,
visible: gameLibMaterial.visible, visible: apiMaterial.visible,
side: gameLibMaterial.side, side: apiMaterial.side,
color: new graphics.instance.Color( color: new graphics.instance.Color(
gameLibMaterial.color.r, apiMaterial.color.r,
gameLibMaterial.color.g, apiMaterial.color.g,
gameLibMaterial.color.b apiMaterial.color.b
), ),
roughness: gameLibMaterial.roughness, roughness: apiMaterial.roughness,
metalness: gameLibMaterial.metalness, metalness: apiMaterial.metalness,
lightMapIntensity: gameLibMaterial.lightMapIntensity, lightMapIntensity: apiMaterial.lightMapIntensity,
aoMapIntensity: gameLibMaterial.aoMapIntensity, aoMapIntensity: apiMaterial.aoMapIntensity,
emissive: new graphics.instance.Color( emissive: new graphics.instance.Color(
gameLibMaterial.emissive.r, apiMaterial.emissive.r,
gameLibMaterial.emissive.g, apiMaterial.emissive.g,
gameLibMaterial.emissive.b apiMaterial.emissive.b
), ),
emissiveIntensity: gameLibMaterial.emissiveIntensity, emissiveIntensity: apiMaterial.emissiveIntensity,
bumpScale: gameLibMaterial.bumpScale, bumpScale: apiMaterial.bumpScale,
normalScale: gameLibMaterial.normalScale, normalScale: apiMaterial.normalScale,
displacementScale: gameLibMaterial.displacementScale, displacementScale: apiMaterial.displacementScale,
refractionRatio: gameLibMaterial.refractionRatio, refractionRatio: apiMaterial.refractionRatio,
fog: gameLibMaterial.fog, fog: apiMaterial.fog,
shading: gameLibMaterial.shading, shading: apiMaterial.shading,
wireframe: gameLibMaterial.wireframe, wireframe: apiMaterial.wireframe,
wireframeLinewidth: gameLibMaterial.wireframeLineWidth, wireframeLinewidth: apiMaterial.wireframeLineWidth,
wireframeLinecap: gameLibMaterial.wireframeLineCap, wireframeLinecap: apiMaterial.wireframeLineCap,
wireframeLinejoin: gameLibMaterial.wireframeLineJoin, wireframeLinejoin: apiMaterial.wireframeLineJoin,
vertexColors: gameLibMaterial.vertexColors, vertexColors: apiMaterial.vertexColors,
skinning: gameLibMaterial.skinning, skinning: apiMaterial.skinning,
morphTargets: gameLibMaterial.morphTargets, morphTargets: apiMaterial.morphTargets,
morphNormals: gameLibMaterial.morphNormals morphNormals: apiMaterial.morphNormals
}); });
blenderMaps.push( blenderMaps.push(
@ -592,62 +682,63 @@ GameLib.D3.Material.CreateInstanceMaterial = function(
'alpha', 'alpha',
'environment' 'environment'
); );
} else if (gameLibMaterial.materialType == GameLib.D3.Material.TYPE_MESH_PHONG) {
} else if (apiMaterial.materialType == GameLib.D3.Material.TYPE_MESH_PHONG) {
instanceMaterial = new graphics.instance.MeshPhongMaterial({ instanceMaterial = new graphics.instance.MeshPhongMaterial({
name: gameLibMaterial.name, name: apiMaterial.name,
opacity: gameLibMaterial.opacity, opacity: apiMaterial.opacity,
transparent: gameLibMaterial.transparent, transparent: apiMaterial.transparent,
blending: gameLibMaterial.blending, blending: apiMaterial.blending,
blendSrc: gameLibMaterial.blendSrc, blendSrc: apiMaterial.blendSrc,
blendDst: gameLibMaterial.blendDst, blendDst: apiMaterial.blendDst,
blendEquation: gameLibMaterial.blendEquation, blendEquation: apiMaterial.blendEquation,
depthTest: gameLibMaterial.depthTest, depthTest: apiMaterial.depthTest,
depthFunc: gameLibMaterial.depthFunc, depthFunc: apiMaterial.depthFunc,
depthWrite: gameLibMaterial.depthWrite, depthWrite: apiMaterial.depthWrite,
polygonOffset: gameLibMaterial.polygonOffset, polygonOffset: apiMaterial.polygonOffset,
polygonOffsetFactor: gameLibMaterial.polygonOffsetFactor, polygonOffsetFactor: apiMaterial.polygonOffsetFactor,
polygonOffsetUnits: gameLibMaterial.polygonOffsetUnits, polygonOffsetUnits: apiMaterial.polygonOffsetUnits,
alphaTest: gameLibMaterial.alphaTest, alphaTest: apiMaterial.alphaTest,
clippingPlanes: gameLibMaterial.clippingPlanes, clippingPlanes: apiMaterial.clippingPlanes,
clipShadows: gameLibMaterial.clipShadows, clipShadows: apiMaterial.clipShadows,
overdraw: gameLibMaterial.overdraw, overdraw: apiMaterial.overdraw,
visible: gameLibMaterial.visible, visible: apiMaterial.visible,
side: gameLibMaterial.side, side: apiMaterial.side,
color: new graphics.instance.Color( color: new graphics.instance.Color(
gameLibMaterial.color.r, apiMaterial.color.r,
gameLibMaterial.color.g, apiMaterial.color.g,
gameLibMaterial.color.b apiMaterial.color.b
), ),
specular: new graphics.instance.Color( specular: new graphics.instance.Color(
gameLibMaterial.specular.r, apiMaterial.specular.r,
gameLibMaterial.specular.g, apiMaterial.specular.g,
gameLibMaterial.specular.b apiMaterial.specular.b
), ),
shininess: gameLibMaterial.shininess, shininess: apiMaterial.shininess,
lightMapIntensity: gameLibMaterial.lightMapIntensity, lightMapIntensity: apiMaterial.lightMapIntensity,
aoMapIntensity: gameLibMaterial.aoMapIntensity, aoMapIntensity: apiMaterial.aoMapIntensity,
emissive: new graphics.instance.Color( emissive: new graphics.instance.Color(
gameLibMaterial.emissive.r, apiMaterial.emissive.r,
gameLibMaterial.emissive.g, apiMaterial.emissive.g,
gameLibMaterial.emissive.b apiMaterial.emissive.b
), ),
emissiveIntensity: gameLibMaterial.emissiveIntensity, emissiveIntensity: apiMaterial.emissiveIntensity,
bumpScale: gameLibMaterial.bumpScale, bumpScale: apiMaterial.bumpScale,
normalScale: gameLibMaterial.normalScale, normalScale: apiMaterial.normalScale,
displacementScale: gameLibMaterial.displacementScale, displacementScale: apiMaterial.displacementScale,
combine: gameLibMaterial.combine, combine: apiMaterial.combine,
refractionRatio: gameLibMaterial.refractionRatio, refractionRatio: apiMaterial.refractionRatio,
fog: gameLibMaterial.fog, fog: apiMaterial.fog,
shading: gameLibMaterial.shading, shading: apiMaterial.shading,
wireframe: gameLibMaterial.wireframe, wireframe: apiMaterial.wireframe,
wireframeLinewidth: gameLibMaterial.wireframeLineWidth, wireframeLinewidth: apiMaterial.wireframeLineWidth,
wireframeLinecap: gameLibMaterial.wireframeLineCap, wireframeLinecap: apiMaterial.wireframeLineCap,
wireframeLinejoin: gameLibMaterial.wireframeLineJoin, wireframeLinejoin: apiMaterial.wireframeLineJoin,
vertexColors: gameLibMaterial.vertexColors, vertexColors: apiMaterial.vertexColors,
skinning: gameLibMaterial.skinning, skinning: apiMaterial.skinning,
morphTargets: gameLibMaterial.morphTargets, morphTargets: apiMaterial.morphTargets,
morphNormals: gameLibMaterial.morphNormals morphNormals: apiMaterial.morphNormals
}); });
blenderMaps.push( blenderMaps.push(
@ -664,40 +755,16 @@ GameLib.D3.Material.CreateInstanceMaterial = function(
); );
} else { } else {
console.log("material type is not implemented yet: " + gameLibMaterial.materialType + " - material indexes could be screwed up"); console.log("material type is not implemented yet: " + apiMaterial.materialType + " - material indexes could be screwed up");
defer.reject(null);
return defer.promise;
} }
if (blenderMaps.length > 0) { if (blenderMaps.length > 0) {
imageLoader.setup(
var textureMaps = GameLib.D3.Texture.LoadMaps(
gameLibMaterial, gameLibMaterial,
blenderMaps,
instanceMaterial, instanceMaterial,
graphics, blenderMaps
uploadUrl,
progressCallback
); );
if (textureMaps.length > 0) {
Q.all(textureMaps).then(
function onFulfilled(map){
defer.resolve(instanceMaterial);
},
function onRejected(message) {
console.log(message);
defer.reject(message);
},
function onProgress(progress) {
console.log('progress');
}
)
}
} else {
defer.resolve(instanceMaterial);
} }
return defer.promise; return instanceMaterial;
}; };

View File

@ -254,9 +254,20 @@ GameLib.D3.Scene.LoadScene = function(
console.log("loading scene " + gameLibScene.name); console.log("loading scene " + gameLibScene.name);
if (typeof onLoaded == 'undefined') {
console.warn('No on loaded callback has been specified');
throw new Error('No on loaded callback has been specified');
}
graphics.isNotThreeThrow(); graphics.isNotThreeThrow();
var meshQ = []; var instanceMeshes = [];
var gameLibTexture = new GameLib.D3.Texture(
graphics,
uploadUrl,
progressCallback
);
for (var m = 0; m < gameLibScene.meshes.length; m++) { for (var m = 0; m < gameLibScene.meshes.length; m++) {
@ -393,148 +404,123 @@ GameLib.D3.Scene.LoadScene = function(
geometry.computeVertexNormals(); geometry.computeVertexNormals();
} }
var instanceMaterial = GameLib.D3.Material.CreateInstanceMaterial( var instanceMaterial = GameLib.D3.Material.CreateInstanceMaterial(
materials[0], materials[0],
graphics, graphics,
uploadUrl, gameLibTexture
progressCallback
); );
var result = instanceMaterial.then( var instanceMesh = GameLib.D3.Mesh.CreateInstanceMesh(
mesh,
(function(__mesh, __geometry) { geometry,
return function(materials) { instanceMaterial,
graphics
console.log("loaded material : " + materials[0].name);
/**
* We don't support MultiMaterial atm - it doesn't work with raycasting
*/
var material = materials[0];
var instanceMesh = GameLib.D3.Mesh.CreateInstanceMesh(
__mesh,
__geometry,
material,
graphics
);
instanceMesh.name = __mesh.name;
instanceMesh.position.x = __mesh.position.x;
instanceMesh.position.y = __mesh.position.y;
instanceMesh.position.z = __mesh.position.z;
instanceMesh.rotation.x = __mesh.rotation.x;
instanceMesh.rotation.y = __mesh.rotation.y;
instanceMesh.rotation.z = __mesh.rotation.z;
instanceMesh.scale.x = __mesh.scale.x;
instanceMesh.scale.y = __mesh.scale.y;
instanceMesh.scale.z = __mesh.scale.z;
instanceMesh.quaternion.x = __mesh.quaternion.x;
instanceMesh.quaternion.y = __mesh.quaternion.y;
instanceMesh.quaternion.z = __mesh.quaternion.z;
instanceMesh.quaternion.w = __mesh.quaternion.w;
return instanceMesh;
};
})(mesh, geometry),
function onRejected(message) {
console.log(message);
return null;
},
function onProgress(progress) {
console.log('material progress');
}
); );
meshQ.push(result); instanceMesh.name = mesh.name;
instanceMesh.position.x = mesh.position.x;
instanceMesh.position.y = mesh.position.y;
instanceMesh.position.z = mesh.position.z;
instanceMesh.rotation.x = mesh.rotation.x;
instanceMesh.rotation.y = mesh.rotation.y;
instanceMesh.rotation.z = mesh.rotation.z;
instanceMesh.scale.x = mesh.scale.x;
instanceMesh.scale.y = mesh.scale.y;
instanceMesh.scale.z = mesh.scale.z;
instanceMesh.quaternion.x = mesh.quaternion.x;
instanceMesh.quaternion.y = mesh.quaternion.y;
instanceMesh.quaternion.z = mesh.quaternion.z;
instanceMesh.quaternion.w = mesh.quaternion.w;
instanceMeshes.push(instanceMesh);
} }
debugger; console.log("created all meshes");
console.log('hi');
Q.all(meshQ).then( var instanceLights = [];
function(instanceMeshes){
console.log("all meshes have loaded");
if (typeof onLoaded != 'undefined') {
var instanceLights = []; if (gameLibScene.lights && gameLibScene.lights.length > 0) {
for (var sli = 0; sli < gameLibScene.lights.length; sli++) { for (var glsl = 0; glsl < gameLibScene.lights.length; glsl++) {
var gameLibLight = gameLibScene.lights[sli]; var gameLibLight = gameLibScene.lights[glsl];
var light = null; var light = null;
if (gameLibLight.lightType == 'AmbientLight') { if (gameLibLight.lightType == 'AmbientLight') {
light = new graphics.instance.AmbientLight(gameLibLight.color, gameLibLight.intensity); light = new graphics.instance.AmbientLight(gameLibLight.color, gameLibLight.intensity);
}
if (gameLibLight.lightType == 'DirectionalLight') {
light = new graphics.instance.DirectionalLight(gameLibLight.color, gameLibLight.intensity);
}
if (gameLibLight.lightType == 'PointLight') {
light = new graphics.instance.PointLight(gameLibLight.color, gameLibLight.intensity);
light.distance = gameLibLight.distance;
light.decay = gameLibLight.decay;
}
if (gameLibLight.lightType == 'SpotLight') {
light = new graphics.instance.SpotLight(gameLibLight.color, gameLibLight.intensity);
light.distance = gameLibLight.distance;
light.angle = gameLibLight.angle;
light.penumbra = gameLibLight.penumbra;
light.decay = gameLibLight.decay;
}
light.position.x = gameLibLight.position.x;
light.position.y = gameLibLight.position.y;
light.position.z = gameLibLight.position.z;
light.rotation.x = gameLibLight.rotation.x;
light.rotation.y = gameLibLight.rotation.y;
light.rotation.z = gameLibLight.rotation.z;
if (light == null) {
console.warn('Does not support lights of type :' + gameLibLight.lightType + ', not imported');
} else {
light.name = gameLibLight.name;
instanceLights.push(light);
}
} }
var instanceScene = new graphics.instance.Scene(); if (gameLibLight.lightType == 'DirectionalLight') {
light = new graphics.instance.DirectionalLight(gameLibLight.color, gameLibLight.intensity);
instanceScene.name = gameLibScene.name;
instanceScene.position.x = gameLibScene.position.x;
instanceScene.position.y = gameLibScene.position.y;
instanceScene.position.z = gameLibScene.position.z;
instanceScene.rotation.x = gameLibScene.rotation.x;
instanceScene.rotation.y = gameLibScene.rotation.y;
instanceScene.rotation.z = gameLibScene.rotation.z;
instanceScene.scale.x = gameLibScene.scale.x;
instanceScene.scale.y = gameLibScene.scale.y;
instanceScene.scale.z = gameLibScene.scale.z;
instanceScene.quaternion.x = gameLibScene.quaternion.x;
instanceScene.quaternion.y = gameLibScene.quaternion.y;
instanceScene.quaternion.z = gameLibScene.quaternion.z;
instanceScene.quaternion.w = gameLibScene.quaternion.w;
for (var m = 0; m < instanceMeshes.length; m++) {
instanceScene.add(instanceMeshes[m]);
} }
for (var l = 0; l < instanceLights.length; l++) { if (gameLibLight.lightType == 'PointLight') {
instanceScene.add(instanceLights[l]); light = new graphics.instance.PointLight(gameLibLight.color, gameLibLight.intensity);
light.distance = gameLibLight.distance;
light.decay = gameLibLight.decay;
} }
if (gameLibLight.lightType == 'SpotLight') {
light = new graphics.instance.SpotLight(gameLibLight.color, gameLibLight.intensity);
light.distance = gameLibLight.distance;
light.angle = gameLibLight.angle;
light.penumbra = gameLibLight.penumbra;
light.decay = gameLibLight.decay;
}
light.position.x = gameLibLight.position.x;
light.position.y = gameLibLight.position.y;
light.position.z = gameLibLight.position.z;
light.rotation.x = gameLibLight.rotation.x;
light.rotation.y = gameLibLight.rotation.y;
light.rotation.z = gameLibLight.rotation.z;
if (light == null) {
console.warn('Does not support lights of type :' + gameLibLight.lightType + ', not imported');
} else {
light.name = gameLibLight.name;
instanceLights.push(light);
}
}
}
var instanceScene = new graphics.instance.Scene();
instanceScene.name = gameLibScene.name;
instanceScene.position.x = gameLibScene.position.x;
instanceScene.position.y = gameLibScene.position.y;
instanceScene.position.z = gameLibScene.position.z;
instanceScene.rotation.x = gameLibScene.rotation.x;
instanceScene.rotation.y = gameLibScene.rotation.y;
instanceScene.rotation.z = gameLibScene.rotation.z;
instanceScene.scale.x = gameLibScene.scale.x;
instanceScene.scale.y = gameLibScene.scale.y;
instanceScene.scale.z = gameLibScene.scale.z;
instanceScene.quaternion.x = gameLibScene.quaternion.x;
instanceScene.quaternion.y = gameLibScene.quaternion.y;
instanceScene.quaternion.z = gameLibScene.quaternion.z;
instanceScene.quaternion.w = gameLibScene.quaternion.w;
for (var im = 0; im < instanceMeshes.length; im++) {
instanceScene.add(instanceMeshes[im]);
}
for (var l = 0; l < instanceLights.length; l++) {
instanceScene.add(instanceLights[l]);
}
gameLibTexture.start.then(
function onFullfilled() {
onLoaded( onLoaded(
gameLibScene, gameLibScene,
{ {
@ -543,14 +529,13 @@ GameLib.D3.Scene.LoadScene = function(
meshes: instanceMeshes meshes: instanceMeshes
} }
); );
} },
}, function onRejected(message) {
function(error) { console.log('Image loading failed with the following message: ' + message);
console.log(error); },
} function onProgress() {
).catch( console.log('loading images...');
function(error){
console.log(error);
} }
); );
};
};

View File

@ -240,79 +240,51 @@ GameLib.D3.Texture.LoadMap = function(
return defer.promise; return defer.promise;
} }
textureLoader.crossOrigin = '';
textureLoader.load(
imagePath,
function(texture) {
/**
* onLoad
*/
instanceMaterial[instanceMaterialMapType] = texture;
instanceMaterial[instanceMaterialMapType].name = gameLibTexture.name;
instanceMaterial[instanceMaterialMapType].anisotropy = gameLibTexture.anisotropy;
instanceMaterial[instanceMaterialMapType].encoding = gameLibTexture.encoding;
instanceMaterial[instanceMaterialMapType].flipY = gameLibTexture.flipY;
/**
* We don't restore the format since this changing from OS to OS and breaks the implementation sometimes
*/
instanceMaterial[instanceMaterialMapType].generateMipmaps = gameLibTexture.generateMipmaps;
instanceMaterial[instanceMaterialMapType].magFilter = gameLibTexture.magFilter;
instanceMaterial[instanceMaterialMapType].minFilter = gameLibTexture.minFilter;
instanceMaterial[instanceMaterialMapType].mapping = gameLibTexture.mapping;
instanceMaterial[instanceMaterialMapType].mipmaps = gameLibTexture.mipmaps;
instanceMaterial[instanceMaterialMapType].offset = new graphics.instance.Vector2(
gameLibTexture.offset.x,
gameLibTexture.offset.y
);
instanceMaterial[instanceMaterialMapType].premultiplyAlpha = gameLibTexture.premultiplyAlpha;
instanceMaterial[instanceMaterialMapType].textureType = gameLibTexture.textureType;
instanceMaterial[instanceMaterialMapType].wrapS = gameLibTexture.wrapS;
instanceMaterial[instanceMaterialMapType].wrapT = gameLibTexture.wrapT;
instanceMaterial[instanceMaterialMapType].unpackAlignment = gameLibTexture.unpackAlignment;
instanceMaterial.needsUpdate = true;
defer.resolve(true);
},
function(xhr) {
/**
* onProgress
*/
if (progressCallback) {
progressCallback(Math.round(xhr.loaded / xhr.total * 100));
}
},
function(error) {
/**
* onError
*/
console.log('Image could not be loaded: ' + imagePath, error);
defer.reject('Image could not be loaded: ' + imagePath);
}
);
return defer.promise; return defer.promise;
}; };
/** /**
* Returns an array of image loading Promises * Image Loader - attempts to reduce image loading calls by only loading the necessary images once - and setting
* @param gameLibMaterial * them up per material later.
* @param blenderMaps
* @param instanceMaterial
* @param graphics GameLib.D3.Graphics * @param graphics GameLib.D3.Graphics
* @param uploadUrl String * @param uploadUrl String
* @param progressCallback * @param progressCallback
* @returns Q[] * @constructor
*/ */
GameLib.D3.Texture.LoadMaps = function( GameLib.D3.Texture = function(
gameLibMaterial,
blenderMaps,
instanceMaterial,
graphics, graphics,
uploadUrl, uploadUrl,
progressCallback progressCallback
) { ) {
var textureMaps = []; this.graphics = graphics;
this.graphics.isNotThreeThrow();
this.textureLoader = new this.graphics.instance.TextureLoader();
this.textureLoader.crossOrigin = '';
this.uploadUrl = uploadUrl;
this.progressCallback = progressCallback;
this.urls = [];
this.gameLibMaterials = [];
};
/**
* Sets up the Texture Loader by Notifying it of any images that we intend to download soon
* Instead of starting the download immediately - we should collect all the image URLs and attempt
* to download them only once - then after they have downloaded, we execute any pending OnImageLoaded callbacks
* on the Material
* @param gameLibMaterial
* @param instanceMaterial
* @param blenderMaps
*/
GameLib.D3.Texture.prototype.setup = function(
gameLibMaterial,
instanceMaterial,
blenderMaps
) {
for (var ti = 0; ti < blenderMaps.length; ti++) { for (var ti = 0; ti < blenderMaps.length; ti++) {
@ -328,69 +300,167 @@ GameLib.D3.Texture.LoadMaps = function(
blenderTexture.image.filename blenderTexture.image.filename
) { ) {
var instanceMap = null; var instanceMapId = null;
if (map == 'alpha') { if (map == 'alpha') {
instanceMap = 'alhpaMap'; instanceMapId = 'alhpaMap';
} }
if (map == 'ao') { if (map == 'ao') {
instanceMap = 'aoMap'; instanceMapId = 'aoMap';
} }
if (map == 'bump') { if (map == 'bump') {
instanceMap = 'bumpMap'; instanceMapId = 'bumpMap';
} }
if (map == 'displacement') { if (map == 'displacement') {
instanceMap = 'displacementMap'; instanceMapId = 'displacementMap';
} }
if (map == 'emissive') { if (map == 'emissive') {
instanceMap = 'emissiveMap'; instanceMapId = 'emissiveMap';
} }
if (map == 'environment') { if (map == 'environment') {
instanceMap = 'envMap'; instanceMapId = 'envMap';
} }
if (map == 'light') { if (map == 'light') {
instanceMap = 'lightMap'; instanceMapId = 'lightMap';
} }
if (map == 'specular') { if (map == 'specular') {
instanceMap = 'specularMap'; instanceMapId = 'specularMap';
} }
if (map == 'diffuse') { if (map == 'diffuse') {
instanceMap = 'map'; instanceMapId = 'map';
} }
if (map == 'roughness') { if (map == 'roughness') {
instanceMap = 'roughnessMap'; instanceMapId = 'roughnessMap';
} }
if (map == 'metalness') { if (map == 'metalness') {
instanceMap = 'metalnessMap'; instanceMapId = 'metalnessMap';
} }
if (instanceMap == null) { if (instanceMapId == null) {
console.warn("unsupported map type : " + map); console.warn("unsupported map type : " + map);
} }
textureMaps.push( gameLibMaterial.OnImageLoadedCallbacks.push(
GameLib.D3.Texture.LoadMap( new GameLib.D3.Material.ImageLoadedCallback(
gameLibMaterial.maps[map],
instanceMaterial, instanceMaterial,
instanceMap, instanceMapId
graphics,
uploadUrl,
progressCallback
) )
); );
this.notify(
gameLibMaterial,
blenderTexture.image.filename
);
} }
} }
} }
return textureMaps;
}; };
/**
* Notifies the texture loader to load the image (if not already started)
* @param gameLibMaterial
* @param fileName
* @constructor
*/
GameLib.D3.Texture.prototype.notify = function(
gameLibMaterial,
fileName
) {
this.gameLibMaterials.push(gameLibMaterial);
this.urls.push(this.uploadUrl + '/' + fileName);
};
GameLib.D3.Texture.prototype.loadTexture = function(url, gameLibTexture) {
var defer = Q.defer();
this.textureLoader.load(
url,
function onLoad(textureInstance){
textureInstance.name = gameLibTexture.name;
textureInstance.anisotropy = gameLibTexture.anisotropy;
textureInstance.encoding = gameLibTexture.encoding;
textureInstance.flipY = gameLibTexture.flipY;
/**
* We don't restore the format since this changing from OS to OS and breaks the implementation sometimes
*/
textureInstance.generateMipmaps = gameLibTexture.generateMipmaps;
textureInstance.magFilter = gameLibTexture.magFilter;
textureInstance.minFilter = gameLibTexture.minFilter;
textureInstance.mapping = gameLibTexture.mapping;
textureInstance.mipmaps = gameLibTexture.mipmaps;
textureInstance.offset = new this.graphics.instance.Vector2(
gameLibTexture.offset.x,
gameLibTexture.offset.y
);
textureInstance.premultiplyAlpha = gameLibTexture.premultiplyAlpha;
textureInstance.textureType = gameLibTexture.textureType;
textureInstance.wrapS = gameLibTexture.wrapS;
textureInstance.wrapT = gameLibTexture.wrapT;
textureInstance.unpackAlignment = gameLibTexture.unpackAlignment;
textureInstance.needsUpdate = true;
defer.resolve(textureInstance);
},
function onProgress(xhr){
if (this.progressCallback) {
this.progressCallback(Math.round(xhr.loaded / xhr.total * 100))
}
},
function onError() {
defer.resolve(null);
}
);
return defer.promise;
};
/**
* Starts a Image Loading Process - when all are done - executes all calbacks registered
* on materials listening for an image load to complete
* @returns {promise.promise|jQuery.promise|*|Promise|promise}
*/
GameLib.D3.Texture.prototype.start = function() {
var defer = Q.defer();
var texturesToLoad = [];
for (var u = 0; u < this.urls.length; u++) {
texturesToLoad.push(this.loadTexture(url, this.gameLibMaterials[u]));
}
Q.all(texturesToLoad).then(
function(texture) {
return function onFulfilled(results) {
for (var r = 0; r < results.length; r++) {
for (var t = 0; t < texture.gameLibMaterials.length; t++) {
for (var cb = 0; cb < texture.gameLibMaterials[t].OnImageLoadedCallbacks.length; cb++) {
texture.gameLibMaterials[t].OnImageLoadedCallbacks(results[r]);
}
}
}
defer.resolve(results);
};
}(this),
function onRejected(message){
defer.reject(message);
},
function onProgress(){
console.log('progress');
}
);
return defer.promise;
};