forked from LeenkxTeam/LNXSDK
merge upstream
This commit is contained in:
@ -775,6 +775,7 @@ class Scene {
|
||||
// Attach particle systems
|
||||
#if lnx_particles
|
||||
if (o.particle_refs != null) {
|
||||
cast(object, MeshObject).render_emitter = o.render_emitter;
|
||||
for (ref in o.particle_refs) cast(object, MeshObject).setupParticleSystem(sceneName, ref);
|
||||
}
|
||||
#end
|
||||
|
50
leenkx/Sources/iron/format/bmp/Data.hx
Normal file
50
leenkx/Sources/iron/format/bmp/Data.hx
Normal file
@ -0,0 +1,50 @@
|
||||
/*
|
||||
* format - Haxe File Formats
|
||||
*
|
||||
* BMP File Format
|
||||
* Copyright (C) 2007-2009 Trevor McCauley, Baluta Cristian (hx port) & Robert Sköld (format conversion)
|
||||
*
|
||||
* Copyright (c) 2009, The Haxe Project Contributors
|
||||
* All rights reserved.
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are met:
|
||||
*
|
||||
* - Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* - Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE HAXE PROJECT CONTRIBUTORS "AS IS" AND ANY
|
||||
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
* DISCLAIMED. IN NO EVENT SHALL THE HAXE PROJECT CONTRIBUTORS BE LIABLE FOR
|
||||
* ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
||||
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
||||
* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
|
||||
* DAMAGE.
|
||||
*/
|
||||
package iron.format.bmp;
|
||||
|
||||
typedef Data = {
|
||||
var header : iron.format.bmp.Header;
|
||||
var pixels : haxe.io.Bytes;
|
||||
#if (haxe_ver < 4)
|
||||
var colorTable : Null<haxe.io.Bytes>;
|
||||
#else
|
||||
var ?colorTable : haxe.io.Bytes;
|
||||
#end
|
||||
}
|
||||
|
||||
typedef Header = {
|
||||
var width : Int; // real width (in pixels)
|
||||
var height : Int; // real height (in pixels)
|
||||
var paddedStride : Int; // number of bytes in a stride (including padding)
|
||||
var topToBottom : Bool; // whether the bitmap is stored top to bottom
|
||||
var bpp : Int; // bits per pixel
|
||||
var dataLength : Int; // equal to `paddedStride` * `height`
|
||||
var compression : Int; // which compression is being used, 0 for no compression
|
||||
}
|
122
leenkx/Sources/iron/format/bmp/Reader.hx
Normal file
122
leenkx/Sources/iron/format/bmp/Reader.hx
Normal file
@ -0,0 +1,122 @@
|
||||
/*
|
||||
* format - Haxe File Formats
|
||||
*
|
||||
* BMP File Format
|
||||
* Copyright (C) 2007-2009 Robert Sköld
|
||||
*
|
||||
* Copyright (c) 2009, The Haxe Project Contributors
|
||||
* All rights reserved.
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are met:
|
||||
*
|
||||
* - Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* - Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE HAXE PROJECT CONTRIBUTORS "AS IS" AND ANY
|
||||
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
* DISCLAIMED. IN NO EVENT SHALL THE HAXE PROJECT CONTRIBUTORS BE LIABLE FOR
|
||||
* ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
||||
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
||||
* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
|
||||
* DAMAGE.
|
||||
*/
|
||||
|
||||
package iron.format.bmp;
|
||||
|
||||
import iron.format.bmp.Data;
|
||||
|
||||
|
||||
class Reader {
|
||||
|
||||
var input : haxe.io.Input;
|
||||
|
||||
public function new( i ) {
|
||||
input = i;
|
||||
}
|
||||
|
||||
/**
|
||||
* Only supports uncompressed 24bpp bitmaps (the most common format).
|
||||
*
|
||||
* The returned bytes in `Data.pixels` will be in BGR order, and with padding (if present).
|
||||
*
|
||||
* @see https://msdn.microsoft.com/en-us/library/windows/desktop/dd318229(v=vs.85).aspx
|
||||
* @see https://en.wikipedia.org/wiki/BMP_file_format#Bitmap_file_header
|
||||
*/
|
||||
public function read() : format.bmp.Data {
|
||||
// Read Header
|
||||
for (b in ["B".code, "M".code]) {
|
||||
if (input.readByte() != b) throw "Invalid header";
|
||||
}
|
||||
|
||||
var fileSize = input.readInt32();
|
||||
input.readInt32(); // Reserved
|
||||
var offset = input.readInt32();
|
||||
|
||||
// Read InfoHeader
|
||||
var infoHeaderSize = input.readInt32(); // InfoHeader size
|
||||
if (infoHeaderSize != 40) {
|
||||
throw 'Info headers with size $infoHeaderSize not supported.';
|
||||
}
|
||||
var width = input.readInt32(); // Image width (actual, not padded)
|
||||
var height = input.readInt32(); // Image height
|
||||
var numPlanes = input.readInt16(); // Number of planes
|
||||
var bits = input.readInt16(); // Bits per pixel
|
||||
var compression = input.readInt32(); // Compression type
|
||||
var dataLength = input.readInt32(); // Image data size (includes padding!)
|
||||
input.readInt32(); // Horizontal resolution
|
||||
input.readInt32(); // Vertical resolution
|
||||
var colorsUsed = input.readInt32(); // Colors used (0 when uncompressed)
|
||||
input.readInt32(); // Important colors (0 when uncompressed)
|
||||
|
||||
// If there's no compression, the dataLength may be 0
|
||||
if ( compression == 0 && dataLength == 0 ) dataLength = fileSize - offset;
|
||||
|
||||
var bytesRead = 54; // total read above
|
||||
|
||||
var colorTable : haxe.io.Bytes = null;
|
||||
if ( bits <= 8 ) {
|
||||
if ( colorsUsed == 0 ) {
|
||||
colorsUsed = Tools.getNumColorsForBitDepth(bits);
|
||||
}
|
||||
var colorTableLength = 4 * colorsUsed;
|
||||
colorTable = haxe.io.Bytes.alloc( colorTableLength );
|
||||
input.readFullBytes( colorTable, 0, colorTableLength );
|
||||
bytesRead += colorTableLength;
|
||||
}
|
||||
|
||||
input.read( offset - bytesRead );
|
||||
|
||||
var p = haxe.io.Bytes.alloc( dataLength );
|
||||
|
||||
// Read Raster Data
|
||||
var paddedStride = Tools.computePaddedStride(width, bits);
|
||||
var topToBottom = false;
|
||||
if ( height < 0 ) { // if bitmap is stored top to bottom
|
||||
topToBottom = true;
|
||||
height = -height;
|
||||
}
|
||||
|
||||
input.readFullBytes(p, 0, dataLength);
|
||||
|
||||
return {
|
||||
header: {
|
||||
width: width,
|
||||
height: height,
|
||||
paddedStride: paddedStride,
|
||||
topToBottom: topToBottom,
|
||||
bpp: bits,
|
||||
dataLength: dataLength,
|
||||
compression: compression
|
||||
},
|
||||
pixels: p,
|
||||
colorTable: colorTable
|
||||
}
|
||||
}
|
||||
}
|
256
leenkx/Sources/iron/format/bmp/Tools.hx
Normal file
256
leenkx/Sources/iron/format/bmp/Tools.hx
Normal file
@ -0,0 +1,256 @@
|
||||
/*
|
||||
* format - Haxe File Formats
|
||||
*
|
||||
* BMP File Format
|
||||
* Copyright (C) 2007-2009 Trevor McCauley, Baluta Cristian (hx port) & Robert Sköld (format conversion)
|
||||
*
|
||||
* Copyright (c) 2009, The Haxe Project Contributors
|
||||
* All rights reserved.
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are met:
|
||||
*
|
||||
* - Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* - Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE HAXE PROJECT CONTRIBUTORS "AS IS" AND ANY
|
||||
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
* DISCLAIMED. IN NO EVENT SHALL THE HAXE PROJECT CONTRIBUTORS BE LIABLE FOR
|
||||
* ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
||||
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
||||
* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
|
||||
* DAMAGE.
|
||||
*/
|
||||
package iron.format.bmp;
|
||||
|
||||
|
||||
class Tools {
|
||||
|
||||
// a r g b
|
||||
static var ARGB_MAP(default, never):Array<Int> = [0, 1, 2, 3];
|
||||
static var BGRA_MAP(default, never):Array<Int> = [3, 2, 1, 0];
|
||||
|
||||
static var COLOR_SIZE(default, never):Int = 4;
|
||||
|
||||
/**
|
||||
Extract BMP pixel data (24bpp in BGR format) and expands it to BGRA, removing any padding in the process.
|
||||
**/
|
||||
inline static public function extractBGRA( bmp : iron.format.bmp.Data ) : haxe.io.Bytes {
|
||||
return _extract32(bmp, BGRA_MAP, 0xFF);
|
||||
}
|
||||
|
||||
/**
|
||||
Extract BMP pixel data (24bpp in BGR format) and converts it to ARGB.
|
||||
**/
|
||||
inline static public function extractARGB( bmp : iron.format.bmp.Data ) : haxe.io.Bytes {
|
||||
return _extract32(bmp, ARGB_MAP, 0xFF);
|
||||
}
|
||||
|
||||
/**
|
||||
Creates BMP data from bytes in BGRA format for each pixel.
|
||||
**/
|
||||
inline static public function buildFromBGRA( width : Int, height : Int, srcBytes : haxe.io.Bytes, topToBottom : Bool = false ) : Data {
|
||||
return _buildFrom32(width, height, srcBytes, BGRA_MAP, topToBottom);
|
||||
}
|
||||
|
||||
/**
|
||||
Creates BMP data from bytes in ARGB format for each pixel.
|
||||
**/
|
||||
inline static public function buildFromARGB( width : Int, height : Int, srcBytes : haxe.io.Bytes, topToBottom : Bool = false ) : Data {
|
||||
return _buildFrom32(width, height, srcBytes, ARGB_MAP, topToBottom);
|
||||
}
|
||||
|
||||
inline static public function computePaddedStride(width:Int, bpp:Int):Int {
|
||||
return ((((width * bpp) + 31) & ~31) >> 3);
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets number of colors for indexed palettes
|
||||
*/
|
||||
inline static public function getNumColorsForBitDepth(bpp:Int):Int {
|
||||
return switch (bpp) {
|
||||
case 1: 2;
|
||||
case 4: 16;
|
||||
case 8: 256;
|
||||
case 16: 65536;
|
||||
default: throw 'Unsupported bpp $bpp';
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// `channelMap` contains indices to map into ARGB (f.e. the mapping for ARGB is [0,1,2,3], while for BGRA is [3,2,1,0])
|
||||
static function _extract32( bmp : iron.format.bmp.Data, channelMap : Array<Int>, alpha : Int = 0xFF) : haxe.io.Bytes {
|
||||
var srcBytes = bmp.pixels;
|
||||
var dstLen = bmp.header.width * bmp.header.height * 4;
|
||||
var dstBytes = haxe.io.Bytes.alloc( dstLen );
|
||||
var srcPaddedStride = bmp.header.paddedStride;
|
||||
|
||||
var yDir = -1;
|
||||
var dstPos = 0;
|
||||
var srcPos = srcPaddedStride * (bmp.header.height - 1);
|
||||
|
||||
if ( bmp.header.topToBottom ) {
|
||||
yDir = 1;
|
||||
srcPos = 0;
|
||||
}
|
||||
|
||||
if ( bmp.header.bpp < 8 || bmp.header.bpp == 16 ) {
|
||||
throw 'bpp ${bmp.header.bpp} not supported';
|
||||
}
|
||||
|
||||
var colorTable:haxe.io.Bytes = null;
|
||||
if ( bmp.header.bpp <= 8 ) {
|
||||
var colorTableLength = getNumColorsForBitDepth(bmp.header.bpp);
|
||||
colorTable = haxe.io.Bytes.alloc(colorTableLength * COLOR_SIZE);
|
||||
var definedColorTableLength = Std.int( bmp.colorTable.length / COLOR_SIZE );
|
||||
for( i in 0...definedColorTableLength ) {
|
||||
var b = bmp.colorTable.get( i * COLOR_SIZE);
|
||||
var g = bmp.colorTable.get( i * COLOR_SIZE + 1);
|
||||
var r = bmp.colorTable.get( i * COLOR_SIZE + 2);
|
||||
|
||||
colorTable.set(i * COLOR_SIZE + channelMap[0], alpha);
|
||||
colorTable.set(i * COLOR_SIZE + channelMap[1], r);
|
||||
colorTable.set(i * COLOR_SIZE + channelMap[2], g);
|
||||
colorTable.set(i * COLOR_SIZE + channelMap[3], b);
|
||||
}
|
||||
// We want to have the table the full length in case indices outside the range are present
|
||||
colorTable.fill(definedColorTableLength, colorTableLength - definedColorTableLength, 0);
|
||||
for( i in definedColorTableLength...colorTableLength ) {
|
||||
colorTable.set(i * COLOR_SIZE + channelMap[0], alpha);
|
||||
}
|
||||
}
|
||||
|
||||
switch bmp.header.compression {
|
||||
case 0:
|
||||
while( dstPos < dstLen ) {
|
||||
for( i in 0...bmp.header.width ) {
|
||||
if (bmp.header.bpp == 8) {
|
||||
|
||||
var currentSrcPos = srcPos + i;
|
||||
var index = srcBytes.get(currentSrcPos);
|
||||
dstBytes.blit( dstPos, colorTable, index * COLOR_SIZE, COLOR_SIZE );
|
||||
|
||||
} else if (bmp.header.bpp == 24) {
|
||||
|
||||
var currentSrcPos = srcPos + i * 3;
|
||||
var b = srcBytes.get(currentSrcPos);
|
||||
var g = srcBytes.get(currentSrcPos + 1);
|
||||
var r = srcBytes.get(currentSrcPos + 2);
|
||||
|
||||
dstBytes.set(dstPos + channelMap[0], alpha);
|
||||
dstBytes.set(dstPos + channelMap[1], r);
|
||||
dstBytes.set(dstPos + channelMap[2], g);
|
||||
dstBytes.set(dstPos + channelMap[3], b);
|
||||
|
||||
} else if (bmp.header.bpp == 32) {
|
||||
|
||||
var currentSrcPos = srcPos + i * 4;
|
||||
var b = srcBytes.get(currentSrcPos);
|
||||
var g = srcBytes.get(currentSrcPos + 1);
|
||||
var r = srcBytes.get(currentSrcPos + 2);
|
||||
|
||||
dstBytes.set(dstPos + channelMap[0], alpha);
|
||||
dstBytes.set(dstPos + channelMap[1], r);
|
||||
dstBytes.set(dstPos + channelMap[2], g);
|
||||
dstBytes.set(dstPos + channelMap[3], b);
|
||||
|
||||
}
|
||||
dstPos += 4;
|
||||
}
|
||||
srcPos += yDir * srcPaddedStride;
|
||||
}
|
||||
case 1:
|
||||
srcPos = 0;
|
||||
var x = 0;
|
||||
var y = bmp.header.topToBottom ? 0 : bmp.header.height - 1;
|
||||
while( srcPos < bmp.header.dataLength ) {
|
||||
var count = srcBytes.get(srcPos++);
|
||||
var index = srcBytes.get(srcPos++);
|
||||
if ( count == 0 ) {
|
||||
if ( index == 0 ) {
|
||||
x = 0;
|
||||
y += yDir;
|
||||
} else if ( index == 1 ) {
|
||||
break;
|
||||
} else if ( index == 2 ) {
|
||||
x += srcBytes.get(srcPos++);
|
||||
y += srcBytes.get(srcPos++);
|
||||
} else {
|
||||
count = index;
|
||||
for( i in 0...count ) {
|
||||
index = srcBytes.get(srcPos++);
|
||||
dstBytes.blit( COLOR_SIZE * ((x+i) + y * bmp.header.width), colorTable, index * COLOR_SIZE, COLOR_SIZE );
|
||||
}
|
||||
if (srcPos % 2 != 0) srcPos++;
|
||||
x += count;
|
||||
}
|
||||
} else {
|
||||
for( i in 0...count ) {
|
||||
dstBytes.blit( COLOR_SIZE * ((x+i) + y * bmp.header.width), colorTable, index * COLOR_SIZE, COLOR_SIZE );
|
||||
}
|
||||
x += count;
|
||||
}
|
||||
}
|
||||
default:
|
||||
throw 'compression ${bmp.header.compression} not supported';
|
||||
}
|
||||
|
||||
return dstBytes;
|
||||
}
|
||||
|
||||
// `channelMap` contains indices to map into ARGB (f.e. the mapping for ARGB is [0,1,2,3], while for BGRA is [3,2,1,0])
|
||||
static function _buildFrom32( width : Int, height : Int, srcBytes : haxe.io.Bytes, channelMap : Array<Int>, topToBottom : Bool = false ) : Data {
|
||||
var bpp = 24;
|
||||
var paddedStride = computePaddedStride(width, bpp);
|
||||
var bytesBGR = haxe.io.Bytes.alloc(paddedStride * height);
|
||||
var topToBottom = topToBottom;
|
||||
var dataLength = bytesBGR.length;
|
||||
|
||||
var dstStride = width * 3;
|
||||
var srcLen = width * height * 4;
|
||||
var yDir = -1;
|
||||
var dstPos = dataLength - paddedStride;
|
||||
var srcPos = 0;
|
||||
|
||||
if ( topToBottom ) {
|
||||
yDir = 1;
|
||||
dstPos = 0;
|
||||
}
|
||||
|
||||
while( srcPos < srcLen ) {
|
||||
var i = dstPos;
|
||||
while( i < dstPos + dstStride ) {
|
||||
var r = srcBytes.get(srcPos + channelMap[1]);
|
||||
var g = srcBytes.get(srcPos + channelMap[2]);
|
||||
var b = srcBytes.get(srcPos + channelMap[3]);
|
||||
|
||||
bytesBGR.set(i++, b);
|
||||
bytesBGR.set(i++, g);
|
||||
bytesBGR.set(i++, r);
|
||||
|
||||
srcPos += 4;
|
||||
}
|
||||
dstPos += yDir * paddedStride;
|
||||
}
|
||||
|
||||
return {
|
||||
header: {
|
||||
width: width,
|
||||
height: height,
|
||||
paddedStride: paddedStride,
|
||||
topToBottom: topToBottom,
|
||||
bpp: bpp,
|
||||
dataLength: dataLength,
|
||||
compression: 0
|
||||
},
|
||||
pixels: bytesBGR,
|
||||
colorTable: null
|
||||
}
|
||||
}
|
||||
}
|
74
leenkx/Sources/iron/format/bmp/Writer.hx
Normal file
74
leenkx/Sources/iron/format/bmp/Writer.hx
Normal file
@ -0,0 +1,74 @@
|
||||
/*
|
||||
* format - Haxe File Formats
|
||||
*
|
||||
* BMP File Format
|
||||
* Copyright (C) 2007-2009 Robert Sköld
|
||||
*
|
||||
* Copyright (c) 2009, The Haxe Project Contributors
|
||||
* All rights reserved.
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are met:
|
||||
*
|
||||
* - Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* - Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE HAXE PROJECT CONTRIBUTORS "AS IS" AND ANY
|
||||
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
* DISCLAIMED. IN NO EVENT SHALL THE HAXE PROJECT CONTRIBUTORS BE LIABLE FOR
|
||||
* ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
||||
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
||||
* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
|
||||
* DAMAGE.
|
||||
*/
|
||||
|
||||
package iron.format.bmp;
|
||||
|
||||
import iron.format.bmp.Data;
|
||||
|
||||
|
||||
class Writer {
|
||||
|
||||
static var DATA_OFFSET : Int = 0x36;
|
||||
|
||||
var output : haxe.io.Output;
|
||||
|
||||
public function new(o) {
|
||||
output = o;
|
||||
}
|
||||
|
||||
/**
|
||||
* Specs: http://s223767089.online.de/en/file-format-bmp
|
||||
*/
|
||||
public function write( bmp : Data ) {
|
||||
// Write Header (14 bytes)
|
||||
output.writeString( "BM" ); // Signature
|
||||
output.writeInt32(bmp.pixels.length + DATA_OFFSET ); // FileSize
|
||||
output.writeInt32( 0 ); // Reserved
|
||||
output.writeInt32( DATA_OFFSET ); // Offset
|
||||
|
||||
// Write InfoHeader (40 bytes)
|
||||
output.writeInt32( 40 ); // InfoHeader size
|
||||
output.writeInt32( bmp.header.width ); // Image width
|
||||
var height = bmp.header.height;
|
||||
if (bmp.header.topToBottom) height = -height;
|
||||
output.writeInt32( height ); // Image height
|
||||
output.writeInt16( 1 ); // Number of planes
|
||||
output.writeInt16( 24 ); // Bits per pixel (24bit RGB)
|
||||
output.writeInt32( 0 ); // Compression type (no compression)
|
||||
output.writeInt32( bmp.header.dataLength ); // Image data size (0 when uncompressed)
|
||||
output.writeInt32( 0x2e30 ); // Horizontal resolution
|
||||
output.writeInt32( 0x2e30 ); // Vertical resolution
|
||||
output.writeInt32( 0 ); // Colors used (0 when uncompressed)
|
||||
output.writeInt32( 0 ); // Important colors (0 when uncompressed)
|
||||
|
||||
// Write Raster Data
|
||||
output.write(bmp.pixels);
|
||||
}
|
||||
}
|
@ -21,6 +21,7 @@ class MeshObject extends Object {
|
||||
public var particleChildren: Array<MeshObject> = null;
|
||||
public var particleOwner: MeshObject = null; // Particle object
|
||||
public var particleIndex = -1;
|
||||
public var render_emitter = true;
|
||||
#end
|
||||
public var cameraDistance: Float;
|
||||
public var screenSize = 0.0;
|
||||
@ -255,11 +256,11 @@ class MeshObject extends Object {
|
||||
particleSystems[i].update(particleChildren[i], this);
|
||||
}
|
||||
}
|
||||
if (particleSystems != null && particleSystems.length > 0 && !raw.render_emitter) return;
|
||||
if (particleSystems != null && particleSystems.length > 0 && !render_emitter) return;
|
||||
if (particleSystems == null && cullMaterial(context)) return;
|
||||
#else
|
||||
if (cullMaterial(context)) return;
|
||||
#end
|
||||
|
||||
if (cullMaterial(context)) return;
|
||||
|
||||
// Get lod
|
||||
var mats = materials;
|
||||
var lod = this;
|
||||
|
@ -18,29 +18,29 @@ class ParticleSystem {
|
||||
public var speed = 1.0;
|
||||
var particles: Array<Particle>;
|
||||
var ready: Bool;
|
||||
var frameRate = 24;
|
||||
var lifetime = 0.0;
|
||||
var animtime = 0.0;
|
||||
var time = 0.0;
|
||||
var spawnRate = 0.0;
|
||||
public var frameRate = 24;
|
||||
public var lifetime = 0.0;
|
||||
public var animtime = 0.0;
|
||||
public var time = 0.0;
|
||||
public var spawnRate = 0.0;
|
||||
var seed = 0;
|
||||
|
||||
var r: TParticleData;
|
||||
var gx: Float;
|
||||
var gy: Float;
|
||||
var gz: Float;
|
||||
var alignx: Float;
|
||||
var aligny: Float;
|
||||
var alignz: Float;
|
||||
public var r: TParticleData;
|
||||
public var gx: Float;
|
||||
public var gy: Float;
|
||||
public var gz: Float;
|
||||
public var alignx: Float;
|
||||
public var aligny: Float;
|
||||
public var alignz: Float;
|
||||
var dimx: Float;
|
||||
var dimy: Float;
|
||||
var tilesx: Int;
|
||||
var tilesy: Int;
|
||||
var tilesFramerate: Int;
|
||||
|
||||
var count = 0;
|
||||
var lap = 0;
|
||||
var lapTime = 0.0;
|
||||
public var count = 0;
|
||||
public var lap = 0;
|
||||
public var lapTime = 0.0;
|
||||
var m = Mat4.identity();
|
||||
|
||||
var ownerLoc = new Vec4();
|
||||
@ -149,7 +149,7 @@ class ParticleSystem {
|
||||
// GPU particles transform is attached to owner object
|
||||
}
|
||||
|
||||
function setupGeomGpu(object: MeshObject, owner: MeshObject) {
|
||||
public function setupGeomGpu(object: MeshObject, owner: MeshObject) {
|
||||
var instancedData = new Float32Array(particles.length * 6);
|
||||
var i = 0;
|
||||
|
||||
|
Reference in New Issue
Block a user