Files
alternativa3d-archive/Alternativa3D2/2.0/com/alternativagame/engine3d/skin/.svn/text-base/PolygonSkin.as.svn-base
2024-10-05 12:11:16 +01:00

121 lines
3.0 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package com.alternativagame.engine3d.skin {
import com.alternativagame.engine3d.Event3D;
import com.alternativagame.engine3d.engine3d;
import com.alternativagame.engine3d.material.Material;
import com.alternativagame.engine3d.material.PolygonMaterial;
import com.alternativagame.engine3d.object.mesh.polygon.Polygon3D;
import com.alternativagame.type.Vector;
import flash.geom.Point;
use namespace engine3d;
public class PolygonSkin extends Skin {
use namespace engine3d;
public function PolygonSkin(polygon:Polygon3D) {
super(polygon.mesh);
this.polygon = polygon;
}
override engine3d function draw():void {
super.draw();
var material:PolygonMaterial = polygon.material;
alpha = material.alpha;
blendMode = material.blendMode;
var bx:int = polygon.b.canvasX - x;
var by:int = polygon.b.canvasY - y;
var cx:int = polygon.c.canvasX - x;
var cy:int = polygon.c.canvasY - y;
drawPolygon(bx, by, cx, cy);
}
protected function drawPolygon(bx:int, by:int, cx:int, cy:int):void {}
override protected function updateCoords():void {
x = polygon.a.canvasX;
y = polygon.a.canvasY;
}
override engine3d function get interactive():Boolean {
return polygon.interactive;
}
override engine3d function get material():Material {
return polygon.material;
}
override engine3d function getIntersectionCoords(canvasCoords:Point):Vector {
var res:Vector = new Vector(canvasCoords.x, 0, -canvasCoords.y);
var a:Vector = polygon.a.canvasCoords;
var b:Vector = polygon.b.canvasCoords;
var c:Vector = polygon.c.canvasCoords;
// Определение порядка вершин
var top:Vector;
var middle:Vector;
var bottom:Vector;
if (a.z > b.z) {
if (a.z > c.z) {
top = a;
if (b.z > c.z) {
middle = b;
bottom = c;
} else {
middle = c;
bottom = b;
}
} else {
top = c;
middle = a;
bottom = b;
}
} else {
if (b.z > c.z) {
top = b;
if (a.z > c.z) {
middle = a;
bottom = c;
} else {
middle = c;
bottom = a;
}
} else {
top = c;
middle = b;
bottom = a;
}
}
var k1:Number = (top.z - res.z)/(top.z - bottom.z);
var x1:Number = top.x - (top.x - bottom.x)*k1;
var y1:Number = top.y - (top.y - bottom.y)*k1;
var k2:Number;
var x2:Number;
var y2:Number;
if (res.z > middle.z) {
// В верхней части
k2 = (top.z - res.z)/(top.z - middle.z);
x2 = top.x - (top.x - middle.x)*k2;
y2 = top.y - (top.y - middle.y)*k2;
} else {
// В нижней части
k2 = (middle.z - res.z)/(middle.z - bottom.z);
x2 = middle.x - (middle.x - bottom.x)*k2;
y2 = middle.y - (middle.y - bottom.y)*k2;
}
res.y = y1 - (y1 - y2)*(x1 - res.x)/(x1-x2);
return res;
}
}
}