📄 bitmapmaterial.as
字号:
var dmax:Number = Math.max(dsab, Math.max(dsca, dsbc));
if (dsab == dmax)
{
renderRecMap.a = emMap.a*2;
renderRecMap.b = emMap.b;
renderRecMap.c = emMap.c*2;
renderRecMap.d = emMap.d;
renderRecMap.tx = emMap.tx*2;
renderRecMap.ty = emMap.ty;
nRss.v0.x = mabx * 0.5;
nRss.v0.y = maby * 0.5;
nRss.v0.z = (az+bz) * 0.5;
renderRec(graphics, renderRecMap, v0, nRss.v0, v2, nIndex, renderSessionData, bitmap);
renderRecMap.a = emMap.a*2+emMap.b;
renderRecMap.c = 2*emMap.c+emMap.d;
renderRecMap.tx = emMap.tx*2+emMap.ty-1;
renderRec(graphics, renderRecMap, nRss.v0, v1, v2, nIndex, renderSessionData, bitmap);
return;
}
if (dsca == dmax){
renderRecMap.a = emMap.a;
renderRecMap.b = emMap.b*2;
renderRecMap.c = emMap.c;
renderRecMap.d = emMap.d*2;
renderRecMap.tx = emMap.tx;
renderRecMap.ty = emMap.ty*2;
nRss.v2.x = mcax * 0.5;
nRss.v2.y = mcay * 0.5;
nRss.v2.z = (cz+az) * 0.5;
renderRec(graphics, renderRecMap, v0, v1, nRss.v2, nIndex, renderSessionData, bitmap);
renderRecMap.b += emMap.a;
renderRecMap.d += emMap.c;
renderRecMap.ty += emMap.tx-1;
renderRec(graphics, renderRecMap, nRss.v2, v1, v2, nIndex, renderSessionData, bitmap);
return;
}
renderRecMap.a = emMap.a-emMap.b;
renderRecMap.b = emMap.b*2;
renderRecMap.c = emMap.c-emMap.d;
renderRecMap.d = emMap.d*2;
renderRecMap.tx = emMap.tx-emMap.ty;
renderRecMap.ty = emMap.ty*2;
nRss.v1.x = mbcx * 0.5;
nRss.v1.y = mbcy * 0.5;
nRss.v1.z = (bz+cz)*0.5;
renderRec(graphics, renderRecMap, v0, v1, nRss.v1, nIndex, renderSessionData, bitmap);
renderRecMap.a = emMap.a*2;
renderRecMap.b = emMap.b-emMap.a;
renderRecMap.c = emMap.c*2;
renderRecMap.d = emMap.d-emMap.c;
renderRecMap.tx = emMap.tx*2;
renderRecMap.ty = emMap.ty-emMap.tx;
renderRec(graphics, renderRecMap, v0, nRss.v1, v2, nIndex, renderSessionData, bitmap);
}
/**
* Used to avoid new in renderTriangleBitmap
*/
protected var tempTriangleMatrix:Matrix = new Matrix();
private var a2:Number;
private var b2:Number;
private var c2:Number;
private var d2:Number;
public function renderTriangleBitmap(graphics:Graphics, inMat:Matrix, v0:Vertex3DInstance, v1:Vertex3DInstance, v2:Vertex3DInstance, smooth:Boolean, repeat:Boolean, bitmapData:BitmapData):void
{
a2 = v1.x - v0.x;
b2 = v1.y - v0.y;
c2 = v2.x - v0.x;
d2 = v2.y - v0.y;
tempTriangleMatrix.a = inMat.a*a2 + inMat.b*c2;
tempTriangleMatrix.b = inMat.a*b2 + inMat.b*d2;
tempTriangleMatrix.c = inMat.c*a2 + inMat.d*c2;
tempTriangleMatrix.d = inMat.c*b2 + inMat.d*d2;
tempTriangleMatrix.tx = inMat.tx*a2 + inMat.ty*c2 + v0.x;
tempTriangleMatrix.ty = inMat.tx*b2 + inMat.ty*d2 + v0.y;
graphics.beginBitmapFill(bitmapData, tempTriangleMatrix, repeat, smooth);
graphics.moveTo(v0.x, v0.y);
graphics.lineTo(v1.x, v1.y);
graphics.lineTo(v2.x, v2.y);
graphics.endFill();
}
/**
* Returns a string value representing the material properties in the specified BitmapMaterial object.
*
* @return A string.
*/
public override function toString(): String
{
return 'Texture:' + this.texture + ' lineColor:' + this.lineColor + ' lineAlpha:' + this.lineAlpha;
}
// ______________________________________________________________________ CREATE BITMAP
protected function createBitmap( asset:BitmapData ):BitmapData
{
resetMapping();
var bm:BitmapData;
if( AUTO_MIP_MAPPING )
{
bm = correctBitmap( asset );
}
else
{
this.maxU = this.maxV = 1;
bm = asset;
}
return bm;
}
// ______________________________________________________________________ CORRECT BITMAP FOR MIP MAPPING
protected function correctBitmap( bitmap :BitmapData ):BitmapData
{
var okBitmap :BitmapData;
var levels :Number = 1 << MIP_MAP_DEPTH;
// this is faster than Math.ceil
var bWidth :Number = bitmap.width / levels;
bWidth = bWidth == uint(bWidth) ? bWidth : uint(bWidth)+1;
var bHeight :Number = bitmap.height / levels;
bHeight = bHeight == uint(bHeight) ? bHeight : uint(bHeight)+1;
var width :Number = levels * bWidth;
var height :Number = levels * bHeight;
// Check for BitmapData maximum size
var ok:Boolean = true;
if( width > 2880 )
{
width = bitmap.width;
ok = false;
}
if( height > 2880 )
{
height = bitmap.height;
ok = false;
}
if( ! ok ) Papervision3D.log( "Material " + this.name + ": Texture too big for mip mapping. Resizing recommended for better performance and quality." );
// Create new bitmap?
if( bitmap && ( bitmap.width % levels !=0 || bitmap.height % levels != 0 ) )
{
okBitmap = new BitmapData( width, height, bitmap.transparent, 0x00000000 );
// this is for ISM and offsetting bitmaps that have been resized
widthOffset = bitmap.width;
heightOffset = bitmap.height;
this.maxU = bitmap.width / width;
this.maxV = bitmap.height / height;
okBitmap.draw( bitmap );
// PLEASE DO NOT REMOVE
extendBitmapEdges( okBitmap, bitmap.width, bitmap.height );
}
else
{
this.maxU = this.maxV = 1;
okBitmap = bitmap;
}
return okBitmap;
}
protected function extendBitmapEdges( bmp:BitmapData, originalWidth:Number, originalHeight:Number ):void
{
var srcRect :Rectangle = new Rectangle();
var dstPoint :Point = new Point();
//trace(dstPoint + "BitmapMaterialPOINT?");
var i :int;
// Check width
if( bmp.width > originalWidth )
{
// Extend width
srcRect.x = originalWidth-1;
srcRect.y = 0;
srcRect.width = 1;
srcRect.height = originalHeight;
dstPoint.y = 0;
for( i = originalWidth; i < bmp.width; i++ )
{
dstPoint.x = i;
bmp.copyPixels( bmp, srcRect, dstPoint );
}
}
// Check height
if( bmp.height > originalHeight )
{
// Extend height
srcRect.x = 0;
srcRect.y = originalHeight-1;
srcRect.width = bmp.width;
srcRect.height = 1;
dstPoint.x = 0;
for( i = originalHeight; i < bmp.height; i++ )
{
dstPoint.y = i;
bmp.copyPixels( bmp, srcRect, dstPoint );
}
}
}
// ______________________________________________________________________
/**
* resetUVMatrices();
*
* Resets the precalculated uvmatrices, so they can be recalculated
*/
public function resetUVS():void
{
uvMatrices = new Dictionary(false);
}
/**
* Copies the properties of a material.
*
* @param material Material to copy from.
*/
override public function copy( material :MaterialObject3D ):void
{
super.copy( material );
this.maxU = material.maxU;
this.maxV = material.maxV;
}
/**
* Creates a copy of the material.
*
* @return A newly created material that contains the same properties.
*/
override public function clone():MaterialObject3D
{
var cloned:MaterialObject3D = super.clone();
cloned.maxU = this.maxU;
cloned.maxV = this.maxV;
return cloned;
}
/**
* Sets the material's precise rendering mode. If set to true, material will adaptively render triangles to conquer texture distortion.
*/
public function set precise(boolean:Boolean):void
{
_precise = boolean;
}
public function get precise():Boolean
{
return _precise;
}
/**
* If the material is rendering with @see precise to true, this sets tesselation per pixel ratio.
*/
public function set precision(precision:int):void
{
_precision = precision;
}
public function get precision():int
{
return _precision;
}
/**
* If the material is rendering with @see precise to true, this sets tesselation per pixel ratio.
*
* corrected to set per pixel precision exactly.
*/
public function set pixelPrecision(precision:int):void
{
_precision = precision*precision*1.4;
_perPixelPrecision = precision;
}
public function get pixelPrecision():int
{
return _perPixelPrecision;
}
/**
* A texture object.
*/
public function get texture():Object
{
return this._texture;
}
/**
* @private
*/
public function set texture( asset:Object ):void
{
if( asset is BitmapData == false )
{
Papervision3D.log("Error: BitmapMaterial.texture requires a BitmapData object for the texture");
return;
}
bitmap = createBitmap( BitmapData(asset) );
_texture = asset;
}
override public function destroy():void
{
super.destroy();
if(uvMatrices){
uvMatrices = null;
}
if(bitmap){
bitmap.dispose();
}
this.renderRecStorage = null;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -