Skip to content

Commit

Permalink
Copy external Textures to outputDirectory/textures when exporting
Browse files Browse the repository at this point in the history
  • Loading branch information
80prozent committed Jun 5, 2013
1 parent 9f8db9a commit ec81c03
Show file tree
Hide file tree
Showing 2 changed files with 118 additions and 29 deletions.
65 changes: 48 additions & 17 deletions awaybuilder-core/src/awaybuilder/utils/encoders/AWDEncoder.as
Original file line number Diff line number Diff line change
Expand Up @@ -1127,13 +1127,16 @@ package awaybuilder.utils.encoders

if (_embedtextures){
_blockBody.writeByte(1);//embed
var ba : ByteArray = _encodeBitmap(tex.bitmapData);
var ba : ByteArray = _encodeBitmap(tex.bitmapData)[0];
_blockBody.writeUnsignedInt(ba.length);
_blockBody.writeBytes(ba);
}
else {
_blockBody.writeByte(0);//external
_blockBody.writeUTF(tex.name);
var extension:String="jpg";
if(bitMapHasTransparency(tex.bitmapData,tex.bitmapData.rect.width,tex.bitmapData.rect.height))
extension="png";
_blockBody.writeUTF(String("textures/"+getFileName(tex.name)+"."+extension));
}

_beginElement(); // Properties (empty)
Expand All @@ -1148,7 +1151,13 @@ package awaybuilder.utils.encoders
return returnID;

}

private function getFileName(fullPath: String) : String
{
var fSlash: int = fullPath.lastIndexOf("/");
var bSlash: int = fullPath.lastIndexOf("\\"); // reason for the double slash is just to escape the slash so it doesn't escape the quote!!!
var slashIndex: int = fSlash > bSlash ? fSlash : bSlash;
return fullPath.substr(slashIndex + 1);
}
// encode TextureBlock (id=83)
private function _encodeCubeTextures(cubeTexture:CubeTextureVO) : uint
{
Expand All @@ -1158,12 +1167,12 @@ package awaybuilder.utils.encoders
if (_embedtextures){
_blockBody.writeByte(1);// embed;
_blockBody.writeUTF(cubeTexture.name);
var id_posX : ByteArray = _encodeBitmap(cubeTexture.positiveX);
var id_negX : ByteArray = _encodeBitmap(cubeTexture.negativeX);
var id_posY : ByteArray = _encodeBitmap(cubeTexture.positiveY);
var id_negY : ByteArray = _encodeBitmap(cubeTexture.negativeY);
var id_posZ : ByteArray = _encodeBitmap(cubeTexture.positiveZ);
var id_negZ : ByteArray = _encodeBitmap(cubeTexture.negativeZ);
var id_posX : ByteArray = _encodeBitmap(cubeTexture.positiveX)[0];
var id_negX : ByteArray = _encodeBitmap(cubeTexture.negativeX)[0];
var id_posY : ByteArray = _encodeBitmap(cubeTexture.positiveY)[0];
var id_negY : ByteArray = _encodeBitmap(cubeTexture.negativeY)[0];
var id_posZ : ByteArray = _encodeBitmap(cubeTexture.positiveZ)[0];
var id_negZ : ByteArray = _encodeBitmap(cubeTexture.negativeZ)[0];
// write all encodedBitMaps into the file
_blockBody.writeUnsignedInt(id_posX.length);
_blockBody.writeBytes(id_posX);
Expand All @@ -1181,13 +1190,32 @@ package awaybuilder.utils.encoders
else{
_blockBody.writeByte(0);//external
_blockBody.writeUTF(cubeTexture.name);
var extension:String="jpg";
extension="jpg";
if(bitMapHasTransparency(cubeTexture.positiveX,cubeTexture.positiveX.rect.width,cubeTexture.positiveX.rect.height))
extension="png";
_blockBody.writeUTF(String("textures/"+getFileName(cubeTexture.name)+"_posX."+extension));
extension="jpg";
if(bitMapHasTransparency(cubeTexture.negativeX,cubeTexture.negativeX.rect.width,cubeTexture.negativeX.rect.height))
extension="png";
_blockBody.writeUTF(String("textures/"+getFileName(cubeTexture.name)+"_negX."+extension));
extension="jpg";
if(bitMapHasTransparency(cubeTexture.positiveY,cubeTexture.positiveY.rect.width,cubeTexture.positiveY.rect.height))
extension="png";
_blockBody.writeUTF(String("textures/"+getFileName(cubeTexture.name)+"_posY."+extension));
extension="jpg";
if(bitMapHasTransparency(cubeTexture.negativeY,cubeTexture.negativeY.rect.width,cubeTexture.negativeY.rect.height))
extension="png";
_blockBody.writeUTF(String("textures/"+getFileName(cubeTexture.name)+"_negY."+extension));
extension="jpg";
if(bitMapHasTransparency(cubeTexture.positiveZ,cubeTexture.positiveZ.rect.width,cubeTexture.positiveZ.rect.height))
extension="png";
_blockBody.writeUTF(String("textures/"+getFileName(cubeTexture.name)+"_posZ."+extension));
extension="jpg";
if(bitMapHasTransparency(cubeTexture.negativeZ,cubeTexture.negativeZ.rect.width,cubeTexture.negativeZ.rect.height))
extension="png";
_blockBody.writeUTF(String("textures/"+getFileName(cubeTexture.name)+"_negZ."+extension));

_blockBody.writeUTF(cubeTexture.name);
_blockBody.writeUTF(cubeTexture.name);
_blockBody.writeUTF(cubeTexture.name);
_blockBody.writeUTF(cubeTexture.name);
_blockBody.writeUTF(cubeTexture.name);
_blockBody.writeUTF(cubeTexture.name);

}

Expand Down Expand Up @@ -1840,11 +1868,12 @@ package awaybuilder.utils.encoders
}

// encodes a Bitmap into a ByteArray - if the Bitmap contains transparent Pixel, its encodet to PNG, otherwise it is encodet to JPG
private function _encodeBitmap(bitMap:BitmapData):ByteArray
public function _encodeBitmap(bitMap:BitmapData):Array
{
var usePNG : Boolean;
var ba : ByteArray;
usePNG=bitMapHasTransparency(bitMap,bitMap.rect.width,bitMap.rect.height);
var returnArray:Array=new Array();
ba = new ByteArray();
if (usePNG){
bitMap.encode(bitMap.rect, new PNGEncoderOptions(), ba);
Expand All @@ -1853,7 +1882,9 @@ package awaybuilder.utils.encoders
else {
bitMap.encode(bitMap.rect, new JPEGEncoderOptions(80), ba);
}
return ba;
returnArray.push(ba);
returnArray.push(usePNG);
return returnArray;
}
//check if a transparent pixel was found in a bitmap (use PNG vs JPG)
private function bitMapHasTransparency(bmd:BitmapData,w:Number,h:Number):Boolean {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,18 @@
package awaybuilder.desktop.model
{
import flash.display.Bitmap;
import flash.display.BitmapData;
import flash.display.JPEGEncoderOptions;
import flash.events.Event;
import flash.filesystem.File;
import flash.filesystem.FileMode;
import flash.filesystem.FileStream;
import flash.net.FileFilter;
import flash.utils.ByteArray;
import flash.utils.Dictionary;

import mx.managers.CursorManager;

import awaybuilder.controller.events.DocumentEvent;
import awaybuilder.controller.events.SaveDocumentEvent;
import awaybuilder.controller.history.HistoryEvent;
Expand All @@ -14,17 +27,6 @@ package awaybuilder.desktop.model
import awaybuilder.utils.encoders.AWDEncoder;
import awaybuilder.utils.encoders.ISceneGraphEncoder;

import flash.display.Bitmap;
import flash.events.Event;
import flash.filesystem.File;
import flash.filesystem.FileMode;
import flash.filesystem.FileStream;
import flash.net.FileFilter;
import flash.utils.ByteArray;
import flash.utils.Dictionary;

import mx.managers.CursorManager;

public class DesktopDocumentService extends SmartDocumentServiceBase implements IDocumentService
{
private static const FILE_EXTENSION : String = '.awd';
Expand Down Expand Up @@ -105,6 +107,60 @@ package awaybuilder.desktop.model
this._fileToData[file] = data;
}

public function saveDocument(data:Object, path:String):void
{

var document : DocumentModel = DocumentModel(data);
if (!document.globalOptions.embedTextures){
saveExternalTextures(data,path)
}

this.save(data,path);
}

public function saveExternalTextures(data:Object, path:String):void
{

var folder:File = File.userDirectory.resolvePath(path);
var textureDirectory:File = folder.parent.resolvePath("textures");
if(!textureDirectory.exists)
textureDirectory.createDirectory();
var document : DocumentModel = DocumentModel(data);
for each (var tex:AssetVO in document.textures){
if (tex is TextureVO){
saveBitmapDataToFile(TextureVO(tex).bitmapData,TextureVO(tex).name,textureDirectory)
}
else if (tex is CubeTextureVO){
saveBitmapDataToFile(CubeTextureVO(tex).positiveX,CubeTextureVO(tex).name+"_posX",textureDirectory)
saveBitmapDataToFile(CubeTextureVO(tex).negativeX,CubeTextureVO(tex).name+"_negX",textureDirectory)
saveBitmapDataToFile(CubeTextureVO(tex).positiveY,CubeTextureVO(tex).name+"_posY",textureDirectory)
saveBitmapDataToFile(CubeTextureVO(tex).negativeY,CubeTextureVO(tex).name+"_negY",textureDirectory)
saveBitmapDataToFile(CubeTextureVO(tex).positiveZ,CubeTextureVO(tex).name+"_posZ",textureDirectory)
saveBitmapDataToFile(CubeTextureVO(tex).negativeZ,CubeTextureVO(tex).name+"_negZ",textureDirectory)

}
}
}

public function saveBitmapDataToFile(_bitmapData:BitmapData, textureName:String, textureDirectory:File):void
{
var tmpFile:File = File.userDirectory.resolvePath(textureName);
var extension:String="";
var encoder : ISceneGraphEncoder = new AWDEncoder();
var returnArray:Array=AWDEncoder(encoder)._encodeBitmap(_bitmapData);
var bytes:ByteArray=returnArray[0];
extension="jpg";
if (returnArray[1])
extension="png";
var textureFile:File = textureDirectory.resolvePath(tmpFile.name+"."+extension);
if (!textureFile.exists){
var saveStream:FileStream = new FileStream();
saveStream.open(textureFile, FileMode.WRITE);
saveStream.writeBytes(bytes);
saveStream.close();
}

}
public function save(data:Object, path:String):void
{
var bytes : ByteArray;
Expand All @@ -116,6 +172,7 @@ package awaybuilder.desktop.model
encoder = new AWDEncoder();
success = encoder.encode(document, bytes);


try
{
var file:File = new File(path);
Expand Down Expand Up @@ -161,9 +218,10 @@ package awaybuilder.desktop.model
var data:Object = this._fileToData[file];
delete this._fileToData[file];

this.save(data, file.nativePath);
this.saveDocument(data, file.nativePath);
}


private function file_save_cancelHandler(event:Event):void
{
var file:File = File(event.currentTarget);
Expand Down

0 comments on commit ec81c03

Please sign in to comment.