mirror of
https://github.com/MapMakersAndProgrammers/alternativa3d-archive.git
synced 2025-10-26 01:49:05 -07:00
68 lines
2.3 KiB
Plaintext
68 lines
2.3 KiB
Plaintext
package com.alternativagame.engine3d.skin {
|
|
import com.alternativagame.engine3d.object.mesh.polygon.TexturePolygon3D;
|
|
import com.alternativagame.engine3d.material.TextureMaterial;
|
|
import com.alternativagame.type.RGB;
|
|
import com.alternativagame.engine3d.engine3d;
|
|
|
|
import flash.display.BitmapData;
|
|
import flash.geom.ColorTransform;
|
|
import flash.geom.Matrix;
|
|
import flash.geom.Point;
|
|
|
|
use namespace engine3d;
|
|
|
|
public class TextureSkin extends FillSkin {
|
|
|
|
use namespace engine3d;
|
|
|
|
private var textureMatrix:Matrix;
|
|
private var texture:BitmapData = null;
|
|
private var aUV:Point;
|
|
private var bUV:Point;
|
|
private var cUV:Point;
|
|
|
|
public function TextureSkin(polygon:TexturePolygon3D) {
|
|
super(polygon);
|
|
}
|
|
|
|
override protected function drawPolygon(bx:int, by:int, cx:int, cy:int):void {
|
|
var poly:TexturePolygon3D = TexturePolygon3D(polygon);
|
|
var material:TextureMaterial = TextureMaterial(poly.material);
|
|
var textureEnabled:Boolean = (material.texture != null) && (poly.aUV != null) && (poly.bUV != null) && (poly.cUV != null);
|
|
|
|
if (textureEnabled) {
|
|
// Если изменилась текстура или UV-координаты, пересчитываем матрицу текстуры
|
|
if ((texture != material.texture) || (aUV != poly.aUV) || (bUV != poly.bUV) || (cUV != poly.cUV)) {
|
|
|
|
// Сохраняем ссылки на текстуру и UV-координаты
|
|
texture = material.texture;
|
|
aUV = poly.aUV;
|
|
bUV = poly.bUV;
|
|
cUV = poly.cUV;
|
|
|
|
// Преобразование текстуры под UV координаты
|
|
textureMatrix = new Matrix();
|
|
textureMatrix.tx = aUV.x * texture.width;
|
|
textureMatrix.ty = -aUV.y * texture.height;
|
|
textureMatrix.a = (bUV.x - aUV.x) * texture.width;
|
|
textureMatrix.b = (aUV.y - bUV.y) * texture.height;
|
|
textureMatrix.c = (cUV.x - aUV.x) * texture.width;
|
|
textureMatrix.d = (aUV.y - cUV.y) * texture.height;
|
|
textureMatrix.invert();
|
|
}
|
|
|
|
var drawMatrix:Matrix = textureMatrix.clone();
|
|
drawMatrix.concat(new Matrix(bx, by, cx, cy));
|
|
with (graphics) {
|
|
clear();
|
|
beginBitmapFill(texture, drawMatrix, true, material.smoothing);
|
|
lineTo(bx, by);
|
|
lineTo(cx, cy);
|
|
}
|
|
} else {
|
|
super.drawPolygon(bx, by, cx, cy);
|
|
}
|
|
}
|
|
|
|
}
|
|
} |