mirror of
https://github.com/MapMakersAndProgrammers/alternativa3d-archive.git
synced 2025-10-26 09:49:07 -07:00
121 lines
3.0 KiB
ActionScript
121 lines
3.0 KiB
ActionScript
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;
|
||
}
|
||
|
||
}
|
||
} |