📄 quadrantriddlefilter.as
字号:
package away3d.core.filter
{
import away3d.cameras.*;
import away3d.containers.*;
import away3d.core.*;
import away3d.core.base.*;
import away3d.core.clip.*;
import away3d.core.draw.*;
import away3d.core.render.*;
import flash.utils.*;
/**
* Splits all intersecting triangles and line segments.
*/
public class QuadrantRiddleFilter implements IPrimitiveQuadrantFilter
{
use namespace arcane;
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 rivals:Array;
private var rival:DrawPrimitive;
private var parts:Array;
private var part:DrawPrimitive;
private var subst:Array;
private var focus:Number;
private var av0z:Number;
private var av0p:Number;
private var av0x:Number;
private var av0y:Number;
private var av1z:Number;
private var av1p:Number;
private var av1x:Number;
private var av1y:Number;
private var av2z:Number;
private var av2p:Number;
private var av2x:Number;
private var av2y:Number;
private var ad1x:Number;
private var ad1y:Number;
private var ad1z:Number;
private var ad2x:Number;
private var ad2y:Number;
private var ad2z:Number;
private var apa:Number;
private var apb:Number;
private var apc:Number;
private var apd:Number;
private var tv0z:Number;
private var tv0p:Number;
private var tv0x:Number;
private var tv0y:Number;
private var tv1z:Number;
private var tv1p:Number;
private var tv1x:Number;
private var tv1y:Number;
private var tv2z:Number;
private var tv2p:Number;
private var tv2x:Number;
private var tv2y:Number;
private var sv0:Number;
private var sv1:Number;
private var sv2:Number;
private var td1x:Number;
private var td1y:Number;
private var td1z:Number;
private var td2x:Number;
private var td2y:Number;
private var td2z:Number;
private var tpa:Number;
private var tpb:Number;
private var tpc:Number;
private var tpd:Number;
private var sav0:Number;
private var sav1:Number;
private var sav2:Number;
private var tv0:Vertex;
private var tv1:Vertex;
private var tv2:Vertex;
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 w0x:Number;
private var w0y:Number;
private var w1x:Number;
private var w1y:Number;
private var w2x:Number;
private var w2y:Number;
private var ql01a:Number;
private var ql01b:Number;
private var ql01c:Number;
private var ql01s:Number;
private var ql01w0:Number;
private var ql01w1:Number;
private var ql01w2:Number;
private var ql12a:Number;
private var ql12b:Number;
private var ql12c:Number;
private var ql12s:Number;
private var ql12w0:Number;
private var ql12w1:Number;
private var ql12w2:Number;
private var ql20a:Number;
private var ql20b:Number;
private var ql20c:Number;
private var ql20s: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 d:Number;
private var k0:Number;
private var k1:Number;
private var tv01z:Number;
private var tv01p:Number;
private var tv01x:Number;
private var tv01y:Number;
private var v01:ScreenVertex = new ScreenVertex();
private function riddle(q:DrawPrimitive, w:DrawPrimitive):Array
{
if (q is DrawTriangle)
{
if (w is DrawTriangle)
return riddleTT(q as DrawTriangle, w as DrawTriangle);
if (w is DrawSegment)
return riddleTS(q as DrawTriangle, w as DrawSegment);
}
else
if (q is DrawSegment)
{
if (w is DrawTriangle)
return riddleTS(w as DrawTriangle, q as DrawSegment);
}
return [];
}
private final function riddleTT(q:DrawTriangle, w:DrawTriangle):Array
{
//return if triangle area below 10 or if actual rival triangles do not overlap
if (q.area < 10 || w.area < 10 || !overlap(q, w))
return null;
//deperspective rival v0
av0z = w.v0.z;
av0p = 1 + av0z / focus;
av0x = w.v0.x * av0p;
av0y = w.v0.y * av0p;
//deperspective rival v1
av1z = w.v1.z;
av1p = 1 + av1z / focus;
av1x = w.v1.x * av1p;
av1y = w.v1.y * av1p;
//deperspective rival v2
av2z = w.v2.z;
av2p = 1 + av2z / focus;
av2x = w.v2.x * av2p;
av2y = w.v2.y * av2p;
//calculate rival face normal
ad1x = av1x - av0x;
ad1y = av1y - av0y;
ad1z = av1z - av0z;
ad2x = av2x - av0x;
ad2y = av2y - av0y;
ad2z = av2z - av0z;
apa = ad1y*ad2z - ad1z*ad2y;
apb = ad1z*ad2x - ad1x*ad2z;
apc = ad1x*ad2y - ad1y*ad2x;
//calculate the dot product of the rival normal and rival v0
apd = apa*av0x + apb*av0y + apc*av0z;
//return if normal length is less than 1
if (apa*apa + apb*apb + apc*apc < 1)
return null;
//deperspective v0
tv0z = q.v0.z;
tv0p = 1 + tv0z / focus;
tv0x = q.v0.x * tv0p;
tv0y = q.v0.y * tv0p;
//deperspective v1
tv1z = q.v1.z;
tv1p = 1 + tv1z / focus;
tv1x = q.v1.x * tv1p;
tv1y = q.v1.y * tv1p;
//deperspective v2
tv2z = q.v2.z;
tv2p = 1 + tv2z / focus;
tv2x = q.v2.x * tv2p;
tv2y = q.v2.y * tv2p;
//calculate the dot product of v0, v1 and v2 to the rival normal
sv0 = apa*tv0x + apb*tv0y + apc*tv0z - apd;
sv1 = apa*tv1x + apb*tv1y + apc*tv1z - apd;
sv2 = apa*tv2x + apb*tv2y + apc*tv2z - apd;
if (sv0*sv0 < 0.001)
sv0 = 0;
if (sv1*sv1 < 0.001)
sv1 = 0;
if (sv2*sv2 < 0.001)
sv2 = 0;
if (sv0*sv1 >= -0.01 && sv1*sv2 >= -0.01 && sv2*sv0 >= -0.01)
return null;
//calulate face normal
td1x = tv1x - tv0x;
td1y = tv1y - tv0y;
td1z = tv1z - tv0z;
td2x = tv2x - tv0x;
td2y = tv2y - tv0y;
td2z = tv2z - tv0z;
tpa = td1y*td2z - td1z*td2y;
tpb = td1z*td2x - td1x*td2z;
tpc = td1x*td2y - td1y*td2x;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -