📄 bitmapmaterial.as.svn-base
字号:
/*
* PAPER ON ERVIS NPAPER ISION PE IS ON PERVI IO APER SI PA
* AP VI ONPA RV IO PA SI PA ER SI NP PE ON AP VI ION AP
* PERVI ON PE VISIO APER IONPA RV IO PA RVIS NP PE IS ONPAPE
* ER NPAPER IS PE ON PE ISIO AP IO PA ER SI NP PER
* RV PA RV SI ERVISI NP ER IO PE VISIO AP VISI PA RV3D
* ______________________________________________________________________
* papervision3d.org � blog.papervision3d.org � osflash.org/papervision3d
*/
/*
* Copyright 2006 (c) Carlos Ulloa Matesanz, noventaynueve.com.
*
* Permission is hereby granted, free of charge, to any person
* obtaining a copy of this software and associated documentation
* files (the "Software"), to deal in the Software without
* restriction, including without limitation the rights to use,
* copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following
* conditions:
*
* The above copyright notice and this permission notice shall be
* included in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
* OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
* OTHER DEALINGS IN THE SOFTWARE.
*/
// __________________________________________________________________________ BITMAP MATERIAL
package org.papervision3d.materials
{
import flash.display.BitmapData;
import flash.display.Graphics;
import flash.geom.Matrix;
import flash.geom.Point;
import flash.geom.Rectangle;
import flash.utils.Dictionary;
import org.papervision3d.Papervision3D;
import org.papervision3d.core.geom.renderables.Triangle3D;
import org.papervision3d.core.material.TriangleMaterial;
import org.papervision3d.core.proto.MaterialObject3D;
import org.papervision3d.core.render.data.RenderSessionData;
import org.papervision3d.core.render.draw.ITriangleDrawer;
/**
* The BitmapMaterial class creates a texture from a BitmapData object.
*
* Materials collect data about how objects appear when rendered.
*
*/
public class BitmapMaterial extends TriangleMaterial implements ITriangleDrawer
{
private var _precise:Boolean;
public var focus:Number = 100;
public var minimumRenderSize:Number = 2;
public var precision:Number = 8;
/**
* Indicates if mip mapping is forced.
*/
static public var AUTO_MIP_MAPPING :Boolean = false;
/**
* Levels of mip mapping to force.
*/
static public var MIP_MAP_DEPTH :Number = 8;
// ______________________________________________________________________ TEXTURE
protected var _texture :Object;
public var uvMatrices:Dictionary = new Dictionary();
/**
* @private
*/
protected static var _triMatrix:Matrix = new Matrix();
protected static var _triMap:Matrix;
/**
* @private
*/
protected static var _localMatrix:Matrix = new Matrix();
// ______________________________________________________________________ NEW
/**
* The BitmapMaterial class creates a texture from a BitmapData object.
*
* @param asset A BitmapData object.
*/
public function BitmapMaterial( asset:BitmapData=null, precise:Boolean = false)
{
// texture calls createBitmap. That's where all the init happens. This allows to reinit when changing texture. -C4RL05
// if we have an asset passed in, this means we're the subclass, not the super. Set the texture, let the fun begin.
if( asset ) texture = asset;
this.precise = precise;
}
/**
* Resets the mapping coordinates. Use when the texture has been resized.
*/
public function resetMapping():void
{
uvMatrices = new Dictionary();
}
/**
* drawTriangle
*/
override public function drawTriangle(face3D:Triangle3D, graphics:Graphics, renderSessionData:RenderSessionData, altBitmap:BitmapData = null, altUV:Matrix = null):void
{
if(!_precise){
//Render the bitmap using linear texturing.
if( lineAlpha )
graphics.lineStyle( 0, lineColor, lineAlpha );
if( bitmap )
{
_triMap = altUV ? altUV : (uvMatrices[face3D] || transformUV(face3D));
var x0:Number = face3D.v0.vertex3DInstance.x,
y0:Number = face3D.v0.vertex3DInstance.y,
x1:Number = face3D.v1.vertex3DInstance.x,
y1:Number = face3D.v1.vertex3DInstance.y,
x2:Number = face3D.v2.vertex3DInstance.x,
y2:Number = face3D.v2.vertex3DInstance.y;
_triMatrix.a = x1 - x0;
_triMatrix.b = y1 - y0;
_triMatrix.c = x2 - x0;
_triMatrix.d = y2 - y0;
_triMatrix.tx = x0;
_triMatrix.ty = y0;
_localMatrix.a = _triMap.a;
_localMatrix.b = _triMap.b;
_localMatrix.c = _triMap.c;
_localMatrix.d = _triMap.d;
_localMatrix.tx = _triMap.tx;
_localMatrix.ty = _triMap.ty;
_localMatrix.concat(_triMatrix);
graphics.beginBitmapFill( altBitmap ? altBitmap : bitmap, _localMatrix, tiled, smooth);
}
graphics.moveTo( x0, y0 );
graphics.lineTo( x1, y1 );
graphics.lineTo( x2, y2 );
graphics.lineTo( x0, y0 );
if( bitmap )
graphics.endFill();
if( lineAlpha )
graphics.lineStyle();
renderSessionData.renderStatistics.triangles++;
}else{
//Render the bitmap using 'precise' texturing - @Author Alexander Zahdorsky
_triMap = altUV ? altUV : (uvMatrices[face3D] || transformUV(face3D));
focus = renderSessionData.camera.focus;
renderRec(graphics, _triMap.a, _triMap.b, _triMap.c, _triMap.d, _triMap.tx, _triMap.ty, face3D.v0.vertex3DInstance.x, face3D.v0.vertex3DInstance.y, face3D.v0.vertex3DInstance.z, face3D.v1.vertex3DInstance.x, face3D.v1.vertex3DInstance.y, face3D.v1.vertex3DInstance.z, face3D.v2.vertex3DInstance.x, face3D.v2.vertex3DInstance.y, face3D.v2.vertex3DInstance.z,0, renderSessionData, altBitmap ? altBitmap : bitmap);
}
}
/**
* Applies the updated UV texture mapping values to the triangle. This is required to speed up rendering.
*
*/
public function transformUV(face3D:Triangle3D):Matrix
{
if( ! face3D.uv )
{
Papervision3D.log( "MaterialObject3D: transformUV() uv not found!" );
}
else if( bitmap )
{
var uv :Array = face3D.uv;
var w :Number = bitmap.width * maxU;
var h :Number = bitmap.height * maxV;
var u0 :Number = w * face3D.uv0.u;
var v0 :Number = h * ( 1 - face3D.uv0.v );
var u1 :Number = w * face3D.uv1.u;
var v1 :Number = h * ( 1 - face3D.uv1.v);
var u2 :Number = w * face3D.uv2.u;
var v2 :Number = h * ( 1 - face3D.uv2.v );
// Fix perpendicular projections
if( (u0 == u1 && v0 == v1) || (u0 == u2 && v0 == v2) )
{
u0 -= (u0 > 0.05)? 0.05 : -0.05;
v0 -= (v0 > 0.07)? 0.07 : -0.07;
}
if( u2 == u1 && v2 == v1 )
{
u2 -= (u2 > 0.05)? 0.04 : -0.04;
v2 -= (v2 > 0.06)? 0.06 : -0.06;
}
// Precalculate matrix & correct for mip mapping
var at :Number = ( u1 - u0 );
var bt :Number = ( v1 - v0 );
var ct :Number = ( u2 - u0 );
var dt :Number = ( v2 - v0 );
var m :Matrix = new Matrix( at, bt, ct, dt, u0, v0 );
m.invert();
var mapping:Matrix = uvMatrices[face3D] || (uvMatrices[face3D] = m.clone() );
mapping.a = m.a;
mapping.b = m.b;
mapping.c = m.c;
mapping.d = m.d;
mapping.tx = m.tx;
mapping.ty = m.ty;
}
else Papervision3D.log( "MaterialObject3D: transformUV() material.bitmap not found!" );
return mapping;
}
public function renderRec(graphics:Graphics, ta:Number, tb:Number, tc:Number, td:Number, tx:Number, ty:Number,
ax:Number, ay:Number, az:Number, bx:Number, by:Number, bz:Number, cx:Number, cy:Number, cz:Number, index:Number, renderSessionData:RenderSessionData, bitmap:BitmapData):void
{
if ((az <= 0) && (bz <= 0) && (cz <= 0))
return;
if (index >= 100 || (focus == Infinity) || (Math.max(Math.max(ax, bx), cx) - Math.min(Math.min(ax, bx), cx) < minimumRenderSize) || (Math.max(Math.max(ay, by), cy) - Math.min(Math.min(ay, by), cy) < minimumRenderSize))
{
renderTriangleBitmap(graphics, ta, tb, tc, td, tx, ty, ax, ay, bx, by, cx, cy, smooth, tiled, bitmap);
renderSessionData.renderStatistics.triangles++;
return;
}
var faz:Number = focus + az;
var fbz:Number = focus + bz;
var fcz:Number = focus + cz;
var mabz:Number = 2 / (faz + fbz);
var mbcz:Number = 2 / (fbz + fcz);
var mcaz:Number = 2 / (fcz + faz);
var mabx:Number = (ax*faz + bx*fbz)*mabz;
var maby:Number = (ay*faz + by*fbz)*mabz;
var mbcx:Number = (bx*fbz + cx*fcz)*mbcz;
var mbcy:Number = (by*fbz + cy*fcz)*mbcz;
var mcax:Number = (cx*fcz + ax*faz)*mcaz;
var mcay:Number = (cy*fcz + ay*faz)*mcaz;
var dabx:Number = ax + bx - mabx;
var daby:Number = ay + by - maby;
var dbcx:Number = bx + cx - mbcx;
var dbcy:Number = by + cy - mbcy;
var dcax:Number = cx + ax - mcax;
var dcay:Number = cy + ay - mcay;
var dsab:Number = (dabx*dabx + daby*daby);
var dsbc:Number = (dbcx*dbcx + dbcy*dbcy);
var dsca:Number = (dcax*dcax + dcay*dcay);
if ((dsab <= precision) && (dsca <= precision) && (dsbc <= precision))
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -