📄 anotherrivalfilter.as
字号:
package away3d.core.filter
{
import flash.utils.*;
import away3d.cameras.*;
import away3d.containers.*;
import away3d.core.clip.*;
import away3d.core.draw.*;
import away3d.core.render.*;
/**
* Corrects triangle z-sorting
*/
public class AnotherRivalFilter implements IPrimitiveQuadrantFilter
{
private var maxdelay:int;
private var start:int;
private var check:int;
private var primitives:Array;
private var pri:DrawPrimitive;
private var turn:int;
private var leftover:Array;
private var maxZ:Number;
private var minZ:Number;
private var maxdeltaZ:Number;
private var rivals:Array;
private var rival:DrawPrimitive;
private var parts:Array;
private var part:DrawPrimitive;
private var ZOrderDeeper:int = 1;
private var ZOrderIrrelevant:int = 0;
private var ZOrderHigher:int = -1;
private var ZOrderSame:int = 0;
private var q0x:Number;
private var q0y:Number;
private var q1x:Number;
private var q1y:Number;
private var q2x:Number;
private var q2y:Number;
private var r0x:Number;
private var r0y:Number;
private var r1x:Number;
private var r1y:Number;
private var ql01a:Number;
private var ql01b:Number;
private var ql01c:Number;
private var ql01s:Number;
private var ql01r0:Number;
private var ql01r1:Number;
private var ql12a:Number;
private var ql12b:Number;
private var ql12c:Number;
private var ql12s:Number;
private var ql12r0:Number;
private var ql12r1:Number;
private var ql20a:Number;
private var ql20b:Number;
private var ql20c:Number;
private var ql20s:Number;
private var ql20r0:Number;
private var ql20r1:Number;
private var rla:Number;
private var rlb:Number;
private var rlc:Number;
private var rlq0:Number;
private var rlq1:Number;
private var rlq2:Number;
private var q01r:Boolean;
private var q12r:Boolean;
private var q20r:Boolean;
private var q01rx:Number;
private var q01ry:Number;
private var q12rx:Number;
private var q12ry:Number;
private var q20rx:Number;
private var q20ry:Number;
private var count:int;
private var cx:Number;
private var cy:Number;
private var q01rd:Number;
private var q12rd:Number;
private var q20rd:Number;
private var w0x:Number;
private var w0y:Number;
private var w1x:Number;
private var w1y:Number;
private var w2x:Number;
private var w2y:Number;
private var ql01w0:Number;
private var ql01w1:Number;
private var ql01w2:Number;
private var ql12w0:Number;
private var ql12w1:Number;
private var ql12w2:Number;
private var ql20w0:Number;
private var ql20w1:Number;
private var ql20w2:Number;
private var wl01a:Number;
private var wl01b:Number;
private var wl01c:Number;
private var wl01s:Number;
private var wl01q0:Number;
private var wl01q1:Number;
private var wl01q2:Number;
private var wl12a:Number;
private var wl12b:Number;
private var wl12c:Number;
private var wl12s:Number;
private var wl12q0:Number;
private var wl12q1:Number;
private var wl12q2:Number;
private var wl20a:Number;
private var wl20b:Number;
private var wl20c:Number;
private var wl20s:Number;
private var wl20q0:Number;
private var wl20q1:Number;
private var wl20q2:Number;
private var q01w01:Boolean;
private var q12w01:Boolean;
private var q20w01:Boolean;
private var q01w12:Boolean;
private var q12w12:Boolean;
private var q20w12:Boolean;
private var q01w20:Boolean;
private var q12w20:Boolean;
private var q20w20:Boolean;
private var q01w01x:Number;
private var q01w01y:Number;
private var q12w01x:Number;
private var q12w01y:Number;
private var q20w01x:Number;
private var q20w01y:Number;
private var q01w12x:Number;
private var q01w12y:Number;
private var q12w12x:Number;
private var q12w12y:Number;
private var q20w12x:Number;
private var q20w12y:Number;
private var q01w20x:Number;
private var q01w20y:Number;
private var q12w20x:Number;
private var q12w20y:Number;
private var q20w20x:Number;
private var q20w20y:Number;
private var q01w01d:Number;
private var q12w01d:Number;
private var q20w01d:Number;
private var q01w12d:Number;
private var q12w12d:Number;
private var q20w12d:Number;
private var q01w20d:Number;
private var q12w20d:Number;
private var q20w20d:Number;
private function zconflict(q:DrawPrimitive, w:DrawPrimitive):int
{
if (q is DrawTriangle)
{
if (w is DrawTriangle)
return zconflictTT(q as DrawTriangle, w as DrawTriangle);
if (w is DrawSegment)
return zconflictTS(q as DrawTriangle, w as DrawSegment);
if (q is DrawScaledBitmap)
return zconflictTB(q as DrawTriangle, w as DrawScaledBitmap);
}
else
if (q is DrawSegment)
{
if (w is DrawTriangle)
return -zconflictTS(w as DrawTriangle, q as DrawSegment);
}
else
if (q is DrawScaledBitmap)
{
if (w is DrawTriangle)
return -zconflictTB(w as DrawTriangle, q as DrawScaledBitmap);
if (w is DrawScaledBitmap)
return zconflictBB(q as DrawScaledBitmap, w as DrawScaledBitmap);
}
return ZOrderIrrelevant;
}
private function zconflictBB(q:DrawScaledBitmap, r:DrawScaledBitmap):int
{
if (q.screenZ > r.screenZ)
return ZOrderDeeper;
if (q.screenZ < r.screenZ)
return ZOrderHigher;
return ZOrderSame;
}
private function zconflictTB(q:DrawTriangle, r:DrawScaledBitmap):int
{
if (q.contains(r.screenvertex.x, r.screenvertex.y))
return zcompare(q, r, r.screenvertex.x, r.screenvertex.y);
else
if (q.contains(r.minX, r.minY))
return zcompare(q, r, r.minX, r.minY);
else
if (q.contains(r.minX, r.maxY))
return zcompare(q, r, r.minX, r.maxY);
else
if (q.contains(r.maxX, r.minY))
return zcompare(q, r, r.maxX, r.minY);
else
if (q.contains(r.maxX, r.maxY))
return zcompare(q, r, r.maxX, r.maxY);
else
return ZOrderIrrelevant;
}
private function zconflictTS(q:DrawTriangle, r:DrawSegment):int
{
/*
if (q == null)
return ZOrderIrrelevant;
if (r == null)
return ZOrderIrrelevant;
*/
q0x = q.v0.x;
q0y = q.v0.y;
q1x = q.v1.x;
q1y = q.v1.y;
q2x = q.v2.x;
q2y = q.v2.y;
r0x = r.v0.x;
r0y = r.v0.y;
r1x = r.v1.x;
r1y = r.v1.y;
ql01a = q1y - q0y;
ql01b = q0x - q1x;
ql01c = -(ql01b*q0y + ql01a*q0x);
ql01s = ql01a*q2x + ql01b*q2y + ql01c;
ql01r0 = (ql01a*r0x + ql01b*r0y + ql01c) * ql01s;
ql01r1 = (ql01a*r1x + ql01b*r1y + ql01c) * ql01s;
if ((ql01r0 <= 0.0001) && (ql01r1 <= 0.0001))
return ZOrderIrrelevant;
ql12a = q2y - q1y;
ql12b = q1x - q2x;
ql12c = -(ql12b*q1y + ql12a*q1x);
ql12s = ql12a*q0x + ql12b*q0y + ql12c;
ql12r0 = (ql12a*r0x + ql12b*r0y + ql12c) * ql12s;
ql12r1 = (ql12a*r1x + ql12b*r1y + ql12c) * ql12s;
if ((ql12r0 <= 0.0001) && (ql12r1 <= 0.0001))
return ZOrderIrrelevant;
ql20a = q0y - q2y;
ql20b = q2x - q0x;
ql20c = -(ql20b*q2y + ql20a*q2x);
ql20s = ql20a*q1x + ql20b*q1y + ql20c;
ql20r0 = (ql20a*r0x + ql20b*r0y + ql20c) * ql20s;
ql20r1 = (ql20a*r1x + ql20b*r1y + ql20c) * ql20s;
if ((ql20r0 <= 0.0001) && (ql20r1 <= 0.0001))
return ZOrderIrrelevant;
rla = r1y - r0y;
rlb = r0x - r1x;
rlc = -(rlb*r0y + rla*r0x);
rlq0 = (rla*q0x + rlb*q0y + rlc);
rlq1 = (rla*q1x + rlb*q1y + rlc);
rlq2 = (rla*q2x + rlb*q2y + rlc);
if ((rlq0*rlq1 >= 0.0001) && (rlq1*rlq2 >= 0.0001) && (rlq2*rlq0 >= 0.0001))
return ZOrderIrrelevant;
if (((ql01r0 > -0.0001) && (ql12r0 > -0.0001) && (ql20r0 > -0.0001))
&& ((ql01r1 > -0.0001) && (ql12r1 > -0.0001) && (ql20r1 > -0.0001)))
{
return zcompare(q, r, (r0x+r1x)/2, (r0y+r1y)/2);
}
q01r = ((rlq0*rlq1 < 0.0001) && (ql01r0*ql01r1 < 0.0001));
q12r = ((rlq1*rlq2 < 0.0001) && (ql12r0*ql12r1 < 0.0001));
q20r = ((rlq2*rlq0 < 0.0001) && (ql20r0*ql20r1 < 0.0001));
count = 0;
cx = 0;
cy = 0;
if ((ql01r0 > 0.0001) && (ql12r0 > 0.0001) && (ql20r0 > 0.0001))
{
cx += r0x;
cy += r0y;
count += 1;
}
if ((ql01r1 > 0.0001) && (ql12r1 > 0.0001) && (ql20r1 > 0.0001))
{
cx += r1x;
cy += r1y;
count += 1;
}
if (q01r)
{
q01rd = ql01a*rlb - ql01b*rla;
if (q01rd*q01rd > 0.0001)
{
q01rx = (ql01b*rlc - ql01c*rlb) / q01rd;
q01ry = (ql01c*rla - ql01a*rlc) / q01rd;
cx += q01rx;
cy += q01ry;
count += 1;
}
}
if (q12r)
{
q12rd = ql12a*rlb - ql12b*rla;
if (q12rd*q12rd > 0.0001)
{
q12rx = (ql12b*rlc - ql12c*rlb) / q12rd;
q12ry = (ql12c*rla - ql12a*rlc) / q12rd;
cx += q12rx;
cy += q12ry;
count += 1;
}
}
if (q20r)
{
q20rd = ql20a*rlb - ql20b*rla;
if (q20rd*q20rd > 0.0001)
{
q20rx = (ql20b*rlc - ql20c*rlb) / q20rd;
q20ry = (ql20c*rla - ql20a*rlc) / q20rd;
cx += q20rx;
cy += q20ry;
count += 1;
}
}
return zcompare(q, r, cx / count, cy / count);
}
private function zconflictTT(q:DrawTriangle, w:DrawTriangle):int
{
q0x = q.v0.x;
q0y = q.v0.y;
q1x = q.v1.x;
q1y = q.v1.y;
q2x = q.v2.x;
q2y = q.v2.y;
w0x = w.v0.x;
w0y = w.v0.y;
w1x = w.v1.x;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -