Bläddra i källkod

changed h3d.Vector to 3 components and make Point=Vector, add h3d.Vector4 and updated HxSL generation

Nicolas Cannasse 1 år sedan
förälder
incheckning
9476973f47

+ 2 - 2
h2d/Drawable.hx

@@ -10,7 +10,7 @@ class Drawable extends Object {
 	/**
 		The color multiplier for the drawable. Can be used to adjust individually each of the four channels R,G,B,A (default [1,1,1,1])
 	**/
-	public var color(default,default) : h3d.Vector;
+	public var color(default,default) : h3d.Vector4;
 
 	/**
 		By enabling smoothing, scaling the object up or down will use hardware bilinear filtering resulting in a less crisp aspect.
@@ -51,7 +51,7 @@ class Drawable extends Object {
 	**/
 	function new(parent : h2d.Object) {
 		super(parent);
-		color = new h3d.Vector(1, 1, 1, 1);
+		color = new h3d.Vector4(1, 1, 1, 1);
 	}
 
 	function set_tileWrap(b) {

+ 4 - 4
h2d/TileGroup.hx

@@ -68,7 +68,7 @@ class TileLayerContent extends h3d.prim.Primitive {
 		@param color An RGBA vector used for tinting.
 		@param t The Tile to draw.
 	**/
-	public inline function addColor( x : Float, y : Float, color : h3d.Vector, t : Tile ) {
+	public inline function addColor( x : Float, y : Float, color : h3d.Vector4, t : Tile ) {
 		add(x, y, color.r, color.g, color.b, color.a, t);
 	}
 
@@ -140,7 +140,7 @@ class TileLayerContent extends h3d.prim.Primitive {
 		@param c An RGBA vector used for tinting.
 		@param t The Tile to draw.
 	**/
-	public function addTransform( x : Float, y : Float, sx : Float, sy : Float, r : Float, c : h3d.Vector, t : Tile ) {
+	public function addTransform( x : Float, y : Float, sx : Float, sy : Float, r : Float, c : h3d.Vector4, t : Tile ) {
 
 		var ca = Math.cos(r), sa = Math.sin(r);
 		var hx = t.width, hy = t.height;
@@ -559,7 +559,7 @@ class TileLayerContent extends h3d.prim.Primitive {
 class TileGroup extends Drawable {
 
 	var content : TileLayerContent;
-	var curColor : h3d.Vector;
+	var curColor : h3d.Vector4;
 
 	/**
 		The reference tile used as a Texture source to draw.
@@ -583,7 +583,7 @@ class TileGroup extends Drawable {
 		super(parent);
 		tile = t;
 		rangeMin = rangeMax = -1;
-		curColor = new h3d.Vector(1, 1, 1, 1);
+		curColor = new h3d.Vector4(1, 1, 1, 1);
 		content = new TileLayerContent();
 	}
 

+ 6 - 6
h2d/domkit/BaseComponents.hx

@@ -4,7 +4,7 @@ import domkit.CssValue;
 
 typedef FlowBg = { tile : #if macro Bool #else h2d.Tile #end, borderL : Int, borderT : Int, borderR : Int, borderB : Int, ?color : Int }
 
-class CustomParser extends domkit.CssValue.ValueParser {
+class CustomParser extends domkit.CssValue.ValueParser {
 
 	public function new() {
 		super();
@@ -45,14 +45,14 @@ class CustomParser extends domkit.CssValue.ValueParser {
 	}
 
 
-	function transitionColorF( v1 : h3d.Vector, v2 : h3d.Vector, t : Float ) : h3d.Vector {
-		var v = new h3d.Vector();
+	function transitionColorF( v1 : h3d.Vector4, v2 : h3d.Vector4, t : Float ) : h3d.Vector4 {
+		var v = new h3d.Vector4();
 		v.lerp(v1,v2,t);
 		return v;
 	}
 
-	function parseColorF( v : CssValue ) : h3d.Vector {
-		var f = new h3d.Vector();
+	function parseColorF( v : CssValue ) : h3d.Vector4 {
+		var f = new h3d.Vector4();
 		switch( v ) {
 		case VInt(i):
 			f.r = f.g = f.b = i;
@@ -571,7 +571,7 @@ class ObjectComp implements h2d.domkit.Object implements domkit.Component.Compon
 @:uiComp("drawable") @:domkitDecl
 class DrawableComp extends ObjectComp implements domkit.Component.ComponentDecl<h2d.Drawable> {
 
-	@:p(colorF) @:t(colorF) #if domkit_drawable_color var color #else var tint #end : h3d.Vector;
+	@:p(colorF) @:t(colorF) #if domkit_drawable_color var color #else var tint #end : h3d.Vector4;
 	@:p(auto) var smooth : Null<Bool>;
 	@:p(colorAdjust) var colorAdjust : Null<h3d.Matrix.ColorAdjust>;
 	@:p var tileWrap : Bool;

+ 1 - 1
h3d/Camera.hx

@@ -167,7 +167,7 @@ class Camera {
 		if( sceneHeight < 0 ) sceneHeight = engine.height;
 		var rx = (pixelX / sceneWidth - 0.5) * 2;
 		var ry = (0.5 - pixelY / sceneHeight) * 2;
-		return h3d.col.Ray.fromPoints(unproject(rx, ry, 0).toPoint(), unproject(rx, ry, 1).toPoint());
+		return h3d.col.Ray.fromPoints(unproject(rx, ry, 0), unproject(rx, ry, 1));
 	}
 
 	public function update() {

+ 2 - 2
h3d/Engine.hx

@@ -48,7 +48,7 @@ class Engine {
 	var realFps : Float;
 	var lastTime : Float;
 	var antiAlias : Int;
-	var tmpVector = new h3d.Vector();
+	var tmpVector = new h3d.Vector4();
 	var window : hxd.Window;
 
 	var targetTmp : TargetTmp;
@@ -382,7 +382,7 @@ class Engine {
 		needFlushTarget = false;
 	}
 
-	public function clearF( color : h3d.Vector, ?depth : Float, ?stencil : Int ) {
+	public function clearF( color : h3d.Vector4, ?depth : Float, ?stencil : Int ) {
 		flushTarget();
 		driver.clear(color, depth, stencil);
 	}

+ 1 - 2
h3d/Matrix.hx

@@ -230,7 +230,7 @@ class MatrixImpl {
 
 	public inline function getPosition() {
 		var v = new Vector();
-		v.set(_41,_42,_43,_44);
+		v.set(_41,_42,_43);
 		return v;
 	}
 
@@ -238,7 +238,6 @@ class MatrixImpl {
 		_41 = v.x;
 		_42 = v.y;
 		_43 = v.z;
-		_44 = v.w;
 	}
 
 	public function prependTranslation( x = 0., y = 0., z = 0. ) {

+ 1 - 1
h3d/Quat.hx

@@ -78,7 +78,7 @@ class Quat {
 		// inlined version of initRotationMatrix(Matrix.lookAtX(dir))
 		var ax = dir.clone().normalized();
 		var ay = new Vector(-ax.y, ax.x, 0);
-		if( up != null ) 
+		if( up != null )
 			ay.load(up.cross(ax));
 		ay.normalize();
 		if( ay.lengthSq() < Math.EPSILON2 ) {

+ 31 - 63
h3d/Vector.hx

@@ -9,15 +9,13 @@ class VectorImpl #if apicheck implements h2d.impl.PointApi<Vector,Matrix> #end {
 	public var x : Float;
 	public var y : Float;
 	public var z : Float;
-	public var w : Float;
 
 	// -- gen api
 
-	public inline function new( x = 0., y = 0., z = 0., w = 1. ) {
+	public inline function new( x = 0., y = 0., z = 0. ) {
 		this.x = x;
 		this.y = y;
 		this.z = z;
-		this.w = w;
 	}
 
 	public inline function distance( v : Vector ) {
@@ -32,25 +30,25 @@ class VectorImpl #if apicheck implements h2d.impl.PointApi<Vector,Matrix> #end {
 	}
 
 	public inline function sub( v : Vector ) {
-		return new Vector(x - v.x, y - v.y, z - v.z, w - v.w);
+		return new Vector(x - v.x, y - v.y, z - v.z);
 	}
 
 	public inline function add( v : Vector ) {
-		return new Vector(x + v.x, y + v.y, z + v.z, w + v.w);
+		return new Vector(x + v.x, y + v.y, z + v.z);
 	}
 
 	public inline function scaled( v : Float ) {
 		// see scale
-		return new Vector(x * v, y * v, z * v, w);
+		return new Vector(x * v, y * v, z * v);
 	}
 
 	public inline function equals( v : Vector ) {
-		return x == v.x && y == v.y && z == v.z && w == v.w;
+		return x == v.x && y == v.y && z == v.z;
 	}
 
 	public inline function cross( v : Vector ) {
 		// note : cross product is left-handed
-		return new Vector(y * v.z - z * v.y, z * v.x - x * v.z,  x * v.y - y * v.x, 1);
+		return new Vector(y * v.z - z * v.y, z * v.x - x * v.z,  x * v.y - y * v.x);
 	}
 
 	public inline function dot( v : Vector ) {
@@ -79,18 +77,16 @@ class VectorImpl #if apicheck implements h2d.impl.PointApi<Vector,Matrix> #end {
 		return new Vector(x * k, y * k, z * k);
 	}
 
-	public inline function set(x=0.,y=0.,z=0.,w=1.) {
+	public inline function set(x=0.,y=0.,z=0.) {
 		this.x = x;
 		this.y = y;
 		this.z = z;
-		this.w = w;
 	}
 
 	public inline function load(v : Vector) {
 		this.x = v.x;
 		this.y = v.y;
 		this.z = v.z;
-		this.w = v.w;
 	}
 
 	public inline function scale( f : Float ) {
@@ -107,41 +103,21 @@ class VectorImpl #if apicheck implements h2d.impl.PointApi<Vector,Matrix> #end {
 		this.x = Math.lerp(v1.x, v2.x, k);
 		this.y = Math.lerp(v1.y, v2.y, k);
 		this.z = Math.lerp(v1.z, v2.z, k);
-		this.w = Math.lerp(v1.w, v2.w, k);
 	}
 
 	public inline function transform( m : Matrix ) {
-		var px = x * m._11 + y * m._21 + z * m._31 + w * m._41;
-		var py = x * m._12 + y * m._22 + z * m._32 + w * m._42;
-		var pz = x * m._13 + y * m._23 + z * m._33 + w * m._43;
-		var pw = x * m._14 + y * m._24 + z * m._34 + w * m._44;
+		var px = x * m._11 + y * m._21 + z * m._31 + m._41;
+		var py = x * m._12 + y * m._22 + z * m._32 + m._42;
+		var pz = x * m._13 + y * m._23 + z * m._33 + m._43;
 		x = px;
 		y = py;
 		z = pz;
-		w = pw;
 	}
 
 	public inline function transformed( m : Matrix ) {
-		var px = x * m._11 + y * m._21 + z * m._31 + w * m._41;
-		var py = x * m._12 + y * m._22 + z * m._32 + w * m._42;
-		var pz = x * m._13 + y * m._23 + z * m._33 + w * m._43;
-		var pw = x * m._14 + y * m._24 + z * m._34 + w * m._44;
-		return new Vector(px,py,pz,pw);
-	}
-
-	public inline function transform3x4( m : Matrix ) {
-		var px = x * m._11 + y * m._21 + z * m._31 + w * m._41;
-		var py = x * m._12 + y * m._22 + z * m._32 + w * m._42;
-		var pz = x * m._13 + y * m._23 + z * m._33 + w * m._43;
-		x = px;
-		y = py;
-		z = pz;
-	}
-
-	public inline function transformed3x4( m : Matrix ) {
-		var px = x * m._11 + y * m._21 + z * m._31 + w * m._41;
-		var py = x * m._12 + y * m._22 + z * m._32 + w * m._42;
-		var pz = x * m._13 + y * m._23 + z * m._33 + w * m._43;
+		var px = x * m._11 + y * m._21 + z * m._31 + m._41;
+		var py = x * m._12 + y * m._22 + z * m._32 + m._42;
+		var pz = x * m._13 + y * m._23 + z * m._33 + m._43;
 		return new Vector(px,py,pz);
 	}
 
@@ -162,37 +138,32 @@ class VectorImpl #if apicheck implements h2d.impl.PointApi<Vector,Matrix> #end {
 	}
 
 	public inline function clone() {
-		return new Vector(x,y,z,w);
+		return new Vector(x,y,z);
 	}
 
-	public inline function toPoint() {
-		return new h3d.col.Point(x, y, z);
+	public inline function toVector4() {
+		return new h3d.Vector4(x,y,z);
 	}
 
 	public function toString() {
-		return '{${x.fmt()},${y.fmt()},${z.fmt()},${w.fmt()}}';
+		return '{${x.fmt()},${y.fmt()},${z.fmt()}}';
 	}
 
 	// --- end
 
 	public inline function reflect( n : Vector ) {
 		var k = 2 * this.dot(n);
-		return new Vector(x - k * n.x, y - k * n.y, z - k * n.z, 1);
-	}
-
-	public inline function dot4( v : Vector ) {
-		return x * v.x + y * v.y + z * v.z + w * v.w;
+		return new Vector(x - k * n.x, y - k * n.y, z - k * n.z);
 	}
 
 	public inline function project( m : Matrix ) {
-		var px = x * m._11 + y * m._21 + z * m._31 + w * m._41;
-		var py = x * m._12 + y * m._22 + z * m._32 + w * m._42;
-		var pz = x * m._13 + y * m._23 + z * m._33 + w * m._43;
-		var iw = 1 / (x * m._14 + y * m._24 + z * m._34 + w * m._44);
+		var px = x * m._11 + y * m._21 + z * m._31 + m._41;
+		var py = x * m._12 + y * m._22 + z * m._32 + m._42;
+		var pz = x * m._13 + y * m._23 + z * m._33 + m._43;
+		var iw = 1 / (x * m._14 + y * m._24 + z * m._34 + m._44);
 		x = px * iw;
 		y = py * iw;
 		z = pz * iw;
-		w = 1;
 	}
 
 	/// ----- COLOR FUNCTIONS
@@ -200,22 +171,18 @@ class VectorImpl #if apicheck implements h2d.impl.PointApi<Vector,Matrix> #end {
 	public var r(get, set) : Float;
 	public var g(get, set) : Float;
 	public var b(get, set) : Float;
-	public var a(get, set) : Float;
 
 	inline function get_r() return x;
 	inline function get_g() return y;
 	inline function get_b() return z;
-	inline function get_a() return w;
 	inline function set_r(v) return x = v;
 	inline function set_g(v) return y = v;
 	inline function set_b(v) return z = v;
-	inline function set_a(v) return w = v;
 
 	public inline function setColor( c : Int ) {
 		r = ((c >> 16) & 0xFF) / 255;
 		g = ((c >> 8) & 0xFF) / 255;
 		b = (c & 0xFF) / 255;
-		a = (c >>> 24) / 255;
 	}
 
 	public function makeColor( hue : Float, saturation : Float = 1., brightness : Float = 0.5 ) {
@@ -251,11 +218,10 @@ class VectorImpl #if apicheck implements h2d.impl.PointApi<Vector,Matrix> #end {
 		r += m;
 		g += m;
 		b += m;
-		a = 1;
 	}
 
 	public inline function toColor() {
-		return (Std.int(a.clamp() * 255 + 0.499) << 24) | (Std.int(r.clamp() * 255 + 0.499) << 16) | (Std.int(g.clamp() * 255 + 0.499) << 8) | Std.int(b.clamp() * 255 + 0.499);
+		return 0xFF000000 | (Std.int(r.clamp() * 255 + 0.499) << 16) | (Std.int(g.clamp() * 255 + 0.499) << 8) | Std.int(b.clamp() * 255 + 0.499);
 	}
 
 	public function toColorHSL() {
@@ -277,7 +243,7 @@ class VectorImpl #if apicheck implements h2d.impl.PointApi<Vector,Matrix> #end {
 			h *= Math.PI / 3.0;
 		}
 
-		return new h3d.Vector(h, s, l, a);
+		return new h3d.Vector(h, s, l);
 	}
 
 }
@@ -291,15 +257,18 @@ class VectorImpl #if apicheck implements h2d.impl.PointApi<Vector,Matrix> #end {
 **/
 @:forward abstract Vector(VectorImpl) from VectorImpl to VectorImpl {
 
-	public inline function new( x = 0., y = 0., z = 0., w = 1. ) {
-		this = new VectorImpl(x,y,z,w);
+	public inline function new( x = 0., y = 0., z = 0. ) {
+		this = new VectorImpl(x,y,z);
 	}
 
 	@:op(a - b) public inline function sub(v:Vector) return this.sub(v);
 	@:op(a + b) public inline function add(v:Vector) return this.add(v);
 	@:op(a *= b) public inline function transform(m:Matrix) this.transform(m);
 	@:op(a * b) public inline function transformed(m:Matrix) return this.transformed(m);
-	@:to public inline function toPoint() return this.toPoint();
+
+	// to deprecate at final refactoring
+	public inline function toPoint() return this.clone();
+	public inline function toVector() return this.clone();
 
 	@:op(a *= b) public inline function scale(v:Float) this.scale(v);
 	@:op(a * b) public inline function scaled(v:Float) return this.scaled(v);
@@ -307,7 +276,7 @@ class VectorImpl #if apicheck implements h2d.impl.PointApi<Vector,Matrix> #end {
 
 	public static inline function fromColor( c : Int, scale : Float = 1.0 ) {
 		var s = scale / 255;
-		return new Vector(((c>>16)&0xFF)*s,((c>>8)&0xFF)*s,(c&0xFF)*s,(c >>> 24)*s);
+		return new Vector(((c>>16)&0xFF)*s,((c>>8)&0xFF)*s,(c&0xFF)*s);
 	}
 
 	public static inline function fromArray(a : Array<Float>) {
@@ -315,7 +284,6 @@ class VectorImpl #if apicheck implements h2d.impl.PointApi<Vector,Matrix> #end {
 		if(a.length > 0) r.x = a[0];
 		if(a.length > 1) r.y = a[1];
 		if(a.length > 2) r.z = a[2];
-		if(a.length > 3) r.w = a[3];
 		return r;
 	}
 

+ 316 - 0
h3d/Vector4.hx

@@ -0,0 +1,316 @@
+package h3d;
+using hxd.Math;
+
+/**
+	A 4 floats vector. Everytime a Vector is returned, it means a copy is created.
+**/
+class Vector4Impl /*#if apicheck implements h2d.impl.PointApi<Vector4,Matrix> #end*/ {
+
+	public var x : Float;
+	public var y : Float;
+	public var z : Float;
+	public var w : Float;
+
+	// -- gen api
+
+	public inline function new( x = 0., y = 0., z = 0., w = 1. ) {
+		this.x = x;
+		this.y = y;
+		this.z = z;
+		this.w = w;
+	}
+
+	/*
+	
+	// disable "length" based functions for now (
+	
+	public inline function distance( v : Vector4 ) {
+		return Math.sqrt(distanceSq(v));
+	}
+
+	public inline function distanceSq( v : Vector4 ) {
+		var dx = v.x - x;
+		var dy = v.y - y;
+		var dz = v.z - z;
+		return dx * dx + dy * dy + dz * dz;
+	}
+	
+	public inline function scaled( v : Float ) {
+		// see scale
+		return new Vector(x * v, y * v, z * v, w * v);
+	}
+	
+	public inline function lengthSq() {
+		return x * x + y * y + z * z;
+	}
+
+	public inline function length() {
+		return lengthSq().sqrt();
+	}
+
+	public inline function normalize() {
+		var k = lengthSq();
+		if( k < hxd.Math.EPSILON2 ) k = 0 else k = k.invSqrt();
+		x *= k;
+		y *= k;
+		z *= k;
+	}
+
+	public inline function normalized() {
+		var k = lengthSq();
+		if( k < hxd.Math.EPSILON2 ) k = 0 else k = k.invSqrt();
+		return new Vector(x * k, y * k, z * k);
+	}
+	
+	*/
+
+	public inline function dot4( v : Vector4 ) {
+		return x * v.x + y * v.y + z * v.z + w * v.w;
+	}
+
+	public inline function dot3( v : Vector4 ) {
+		return x * v.x + y * v.y + z * v.z;
+	}
+
+	public inline function scale3( f : Float ) {
+		x *= f;
+		y *= f;
+		z *= f;
+	}
+	
+	public inline function sub( v : Vector4 ) {
+		return new Vector4(x - v.x, y - v.y, z - v.z, w - v.w);
+	}
+
+	public inline function add( v : Vector4 ) {
+		return new Vector4(x + v.x, y + v.y, z + v.z, w + v.w);
+	}
+
+	public inline function equals( v : Vector4 ) {
+		return x == v.x && y == v.y && z == v.z && w == v.w;
+	}
+
+	public inline function cross( v : Vector4 ) {
+		// note : cross product is left-handed
+		return new Vector4(y * v.z - z * v.y, z * v.x - x * v.z,  x * v.y - y * v.x, 1);
+	}
+
+	public inline function set(x=0.,y=0.,z=0.,w=1.) {
+		this.x = x;
+		this.y = y;
+		this.z = z;
+		this.w = w;
+	}
+
+	public inline function load(v : Vector4 ) {
+		this.x = v.x;
+		this.y = v.y;
+		this.z = v.z;
+		this.w = v.w;
+	}
+
+	public inline function lerp( v1 : Vector4, v2 : Vector4, k : Float ) {
+		this.x = Math.lerp(v1.x, v2.x, k);
+		this.y = Math.lerp(v1.y, v2.y, k);
+		this.z = Math.lerp(v1.z, v2.z, k);
+		this.w = Math.lerp(v1.w, v2.w, k);
+	}
+
+	public inline function transform( m : Matrix ) {
+		var px = x * m._11 + y * m._21 + z * m._31 + w * m._41;
+		var py = x * m._12 + y * m._22 + z * m._32 + w * m._42;
+		var pz = x * m._13 + y * m._23 + z * m._33 + w * m._43;
+		var pw = x * m._14 + y * m._24 + z * m._34 + w * m._44;
+		x = px;
+		y = py;
+		z = pz;
+		w = pw;
+	}
+
+	public inline function transformed( m : Matrix ) {
+		var px = x * m._11 + y * m._21 + z * m._31 + w * m._41;
+		var py = x * m._12 + y * m._22 + z * m._32 + w * m._42;
+		var pz = x * m._13 + y * m._23 + z * m._33 + w * m._43;
+		var pw = x * m._14 + y * m._24 + z * m._34 + w * m._44;
+		return new Vector4(px,py,pz,pw);
+	}
+
+	public inline function transform3x4( m : Matrix ) {
+		var px = x * m._11 + y * m._21 + z * m._31 + w * m._41;
+		var py = x * m._12 + y * m._22 + z * m._32 + w * m._42;
+		var pz = x * m._13 + y * m._23 + z * m._33 + w * m._43;
+		x = px;
+		y = py;
+		z = pz;
+	}
+
+	public inline function transformed3x4( m : Matrix ) {
+		var px = x * m._11 + y * m._21 + z * m._31 + w * m._41;
+		var py = x * m._12 + y * m._22 + z * m._32 + w * m._42;
+		var pz = x * m._13 + y * m._23 + z * m._33 + w * m._43;
+		return new Vector4(px,py,pz);
+	}
+
+	public inline function transform3x3( m : Matrix ) {
+		var px = x * m._11 + y * m._21 + z * m._31;
+		var py = x * m._12 + y * m._22 + z * m._32;
+		var pz = x * m._13 + y * m._23 + z * m._33;
+		x = px;
+		y = py;
+		z = pz;
+	}
+
+	public inline function transformed3x3( m : Matrix ) {
+		var px = x * m._11 + y * m._21 + z * m._31;
+		var py = x * m._12 + y * m._22 + z * m._32;
+		var pz = x * m._13 + y * m._23 + z * m._33;
+		return new Vector4(px,py,pz);
+	}
+
+	public inline function clone() {
+		return new Vector4(x,y,z,w);
+	}
+
+	public inline function toVector() {
+		return new h3d.Vector(x, y, z);
+	}
+
+	public function toString() {
+		return '{${x.fmt()},${y.fmt()},${z.fmt()},${w.fmt()}}';
+	}
+
+	public inline function project( m : Matrix ) {
+		var px = x * m._11 + y * m._21 + z * m._31 + w * m._41;
+		var py = x * m._12 + y * m._22 + z * m._32 + w * m._42;
+		var pz = x * m._13 + y * m._23 + z * m._33 + w * m._43;
+		var iw = 1 / (x * m._14 + y * m._24 + z * m._34 + w * m._44);
+		x = px * iw;
+		y = py * iw;
+		z = pz * iw;
+		w = 1;
+	}
+
+	/// ----- COLOR FUNCTIONS
+
+	public var r(get, set) : Float;
+	public var g(get, set) : Float;
+	public var b(get, set) : Float;
+	public var a(get, set) : Float;
+
+	inline function get_r() return x;
+	inline function get_g() return y;
+	inline function get_b() return z;
+	inline function get_a() return w;
+	inline function set_r(v) return x = v;
+	inline function set_g(v) return y = v;
+	inline function set_b(v) return z = v;
+	inline function set_a(v) return w = v;
+
+	public inline function setColor( c : Int ) {
+		r = ((c >> 16) & 0xFF) / 255;
+		g = ((c >> 8) & 0xFF) / 255;
+		b = (c & 0xFF) / 255;
+		a = (c >>> 24) / 255;
+	}
+
+	public function makeColor( hue : Float, saturation : Float = 1., brightness : Float = 0.5 ) {
+		hue = Math.ufmod(hue, Math.PI * 2);
+		var c = (1 - Math.abs(2 * brightness - 1)) * saturation;
+		var x = c * (1 - Math.abs((hue * 3 / Math.PI) % 2. - 1));
+		var m = brightness - c / 2;
+		if( hue < Math.PI / 3 ) {
+			r = c;
+			g = x;
+			b = 0;
+		} else if( hue < Math.PI * 2 / 3 ) {
+			r = x;
+			g = c;
+			b = 0;
+		} else if( hue < Math.PI ) {
+			r = 0;
+			g = c;
+			b = x;
+		} else if( hue < Math.PI * 4 / 3 ) {
+			r = 0;
+			g = x;
+			b = c;
+		} else if( hue < Math.PI * 5 / 3 ) {
+			r = x;
+			g = 0;
+			b = c;
+		} else {
+			r = c;
+			g = 0;
+			b = x;
+		}
+		r += m;
+		g += m;
+		b += m;
+		a = 1;
+	}
+
+	public inline function toColor() {
+		return (Std.int(a.clamp() * 255 + 0.499) << 24) | (Std.int(r.clamp() * 255 + 0.499) << 16) | (Std.int(g.clamp() * 255 + 0.499) << 8) | Std.int(b.clamp() * 255 + 0.499);
+	}
+
+	public function toColorHSL() {
+	    var max = hxd.Math.max(hxd.Math.max(r, g), b);
+		var min = hxd.Math.min(hxd.Math.min(r, g), b);
+		var h, s, l = (max + min) / 2.0;
+
+		if(max == min)
+			h = s = 0.0; // achromatic
+		else {
+			var d = max - min;
+			s = l > 0.5 ? d / (2 - max - min) : d / (max + min);
+			if(max == r)
+				h = (g - b) / d + (g < b ? 6.0 : 0.0);
+			else if(max == g)
+				h = (b - r) / d + 2.0;
+			else
+				h = (r - g) / d + 4.0;
+			h *= Math.PI / 3.0;
+		}
+
+		return new h3d.Vector4(h, s, l, a);
+	}
+
+}
+
+
+
+/**
+	A 4 floats vector. Everytime a Vector is returned, it means a copy is created.
+	For function manipulating the length (length, normalize, dot, scale, etc.), the Vector
+	acts like a Point in the sense only the X/Y/Z components will be affected.
+**/
+@:forward abstract Vector4(Vector4Impl) from Vector4Impl to Vector4Impl {
+
+	public inline function new( x = 0., y = 0., z = 0., w = 1. ) {
+		this = new Vector4Impl(x,y,z,w);
+	}
+
+	@:op(a - b) public inline function sub(v:Vector4) return this.sub(v);
+	@:op(a + b) public inline function add(v:Vector4) return this.add(v);
+	@:op(a *= b) public inline function transform(m:Matrix) this.transform(m);
+	@:op(a * b) public inline function transformed(m:Matrix) return this.transformed(m);
+
+	//@:op(a *= b) public inline function scale(v:Float) this.scale(v);
+	//@:op(a * b) public inline function scaled(v:Float) return this.scaled(v);
+	//@:op(a * b) static inline function scaledInv( f : Float, v : Vector4 ) return v.scaled(f);
+
+	public static inline function fromColor( c : Int, scale : Float = 1.0 ) {
+		var s = scale / 255;
+		return new Vector4(((c>>16)&0xFF)*s,((c>>8)&0xFF)*s,(c&0xFF)*s,(c >>> 24)*s);
+	}
+
+	public static inline function fromArray(a : Array<Float>) {
+		var r = new Vector4();
+		if(a.length > 0) r.x = a[0];
+		if(a.length > 1) r.y = a[1];
+		if(a.length > 2) r.z = a[2];
+		if(a.length > 3) r.w = a[3];
+		return r;
+	}
+
+}

+ 1 - 1
h3d/col/Plane.hx

@@ -50,7 +50,7 @@ class Plane {
 	}
 
 	inline function transformInverseTranspose(m:h3d.Matrix) {
-		var v = new h3d.Vector(nx, ny, nz, -d);
+		var v = new h3d.Vector4(nx, ny, nz, -d);
 		v.transform(m);
 		nx = v.x;
 		ny = v.y;

+ 1 - 169
h3d/col/Point.hx

@@ -1,171 +1,3 @@
 package h3d.col;
-using hxd.Math;
 
-class PointImpl #if apicheck implements h2d.impl.PointApi<Point,Matrix> #end {
-
-	public var x : Float;
-	public var y : Float;
-	public var z : Float;
-
-	// -- gen api ---
-
-	public inline function new(x=0.,y=0.,z=0.) {
-		this.x = x;
-		this.y = y;
-		this.z = z;
-	}
-
-	public inline function scale( v : Float ) {
-		x *= v;
-		y *= v;
-		z *= v;
-	}
-
-	public inline function set(x=0., y=0., z=0.) {
-		this.x = x;
-		this.y = y;
-		this.z = z;
-	}
-
-	public inline function sub( p : Point ) {
-		return new Point(x - p.x, y - p.y, z - p.z);
-	}
-
-	public inline function add( p : Point ) {
-		return new Point(x + p.x, y + p.y, z + p.z);
-	}
-
-	public inline function scaled( v : Float ) {
-		return new Point(x * v, y * v, z * v);
-	}
-
-	public inline function cross( p : Point ) {
-		return new Point(y * p.z - z * p.y, z * p.x - x * p.z,  x * p.y - y * p.x);
-	}
-
-	public inline function equals( other : Point ) : Bool {
-		return x == other.x && y == other.y && z == other.z;
-	}
-
-	public inline function lengthSq() {
-		return x * x + y * y + z * z;
-	}
-
-	public inline function length() {
-		return lengthSq().sqrt();
-	}
-
-	public inline function dot( p : Point ) {
-		return x * p.x + y * p.y + z * p.z;
-	}
-
-	public inline function distanceSq( p : Point ) {
-		var dx = p.x - x;
-		var dy = p.y - y;
-		var dz = p.z - z;
-		return dx * dx + dy * dy + dz * dz;
-	}
-
-	public inline function distance( p : Point ) {
-		return distanceSq(p).sqrt();
-	}
-
-	public inline function normalize() {
-		var k = x * x + y * y + z * z;
-		if( k < hxd.Math.EPSILON2 ) k = 0 else k = k.invSqrt();
-		x *= k;
-		y *= k;
-		z *= k;
-	}
-
-	public inline function normalized() {
-		var k = x * x + y * y + z * z;
-		if( k < hxd.Math.EPSILON2 ) k = 0 else k = k.invSqrt();
-		return new Point(x*k,y*k,z*k);
-	}
-
-	public inline function lerp( p1 : Point, p2 : Point, k : Float ) {
-		var x = Math.lerp(p1.x, p2.x, k);
-		var y = Math.lerp(p1.y, p2.y, k);
-		var z = Math.lerp(p1.z, p2.z, k);
-		this.x = x;
-		this.y = y;
-		this.z = z;
-	}
-
-	public inline function transform( m : Matrix ) {
-		var px = x * m._11 + y * m._21 + z * m._31 + m._41;
-		var py = x * m._12 + y * m._22 + z * m._32 + m._42;
-		var pz = x * m._13 + y * m._23 + z * m._33 + m._43;
-		x = px;
-		y = py;
-		z = pz;
-	}
-
-	public inline function transformed( m : Matrix ) {
-		var px = x * m._11 + y * m._21 + z * m._31 + m._41;
-		var py = x * m._12 + y * m._22 + z * m._32 + m._42;
-		var pz = x * m._13 + y * m._23 + z * m._33 + m._43;
-		return new Point(px,py,pz);
-	}
-
-	public inline function transform3x3( m : Matrix ) {
-		var px = x * m._11 + y * m._21 + z * m._31;
-		var py = x * m._12 + y * m._22 + z * m._32;
-		var pz = x * m._13 + y * m._23 + z * m._33;
-		x = px;
-		y = py;
-		z = pz;
-	}
-
-	public inline function transformed3x3( m : Matrix ) {
-		var px = x * m._11 + y * m._21 + z * m._31;
-		var py = x * m._12 + y * m._22 + z * m._32;
-		var pz = x * m._13 + y * m._23 + z * m._33;
-		return new Point(px,py,pz);
-	}
-
-	public inline function clone() {
-		return new Point(x,y,z);
-	}
-
-	public inline function load( p : Point ) {
-		this.x = p.x;
-		this.y = p.y;
-		this.z = p.z;
-	}
-
-	public function toString() {
-		return 'Point{${x.fmt()},${y.fmt()},${z.fmt()}}';
-	}
-
-	// ----
-
-	public inline function inFrustum( f : Frustum, ?m : h3d.Matrix ) {
-		return f.hasPoint((this:Point));
-	}
-
-	public inline function toVector() {
-		return new Vector(x, y, z);
-	}
-
-
-}
-
-@:forward abstract Point(PointImpl) from PointImpl to PointImpl {
-
-	public inline function new(x=0.,y=0.,z=0.) {
-		this = new PointImpl(x,y,z);
-	}
-
-	@:op(a - b) public inline function sub(p:Point) return this.sub(p);
-	@:op(a + b) public inline function add(p:Point) return this.add(p);
-	@:op(a *= b) public inline function transform(m:Matrix) this.transform(m);
-	@:op(a * b) public inline function transformed(m:Matrix) return this.transformed(m);
-	@:to public inline function toVector() return this.toVector();
-
-	@:op(a *= b) public inline function scale(v:Float) this.scale(v);
-	@:op(a * b) public inline function scaled(v:Float) return this.scaled(v);
-	@:op(a * b) static inline function scaledInv( f : Float, p : Point ) return p.scaled(f);
-
-}
+typedef Point = h3d.Vector;

+ 1 - 1
h3d/col/Ray.hx

@@ -45,7 +45,7 @@ class Ray {
 
 	public inline function transform( m : h3d.Matrix ) {
 		var p = new h3d.Vector(px, py, pz);
-		p.transform3x4(m);
+		p.transform(m);
 		px = p.x;
 		py = p.y;
 		pz = p.z;

+ 4 - 4
h3d/impl/DX12Driver.hx

@@ -268,10 +268,10 @@ class VertexBufferData extends BufferData {
 
 class TextureData extends ResourceData {
 	public var format : DxgiFormat;
-	public var color : h3d.Vector;
+	public var color : h3d.Vector4;
 	public var tmpBuf : dx.Dx12.GpuResource;
 	var clearColorChanges : Int;
-	public function setClearColor( c : h3d.Vector ) {
+	public function setClearColor( c : h3d.Vector4 ) {
 		var color = color;
 		if( clearColorChanges > 10 || (color.r == c.r && color.g == c.g && color.b == c.b && color.a == c.a) )
 			return false;
@@ -465,7 +465,7 @@ class DX12Driver extends h3d.impl.Driver {
 		frame.commandList.setDescriptorHeaps(arr);
 	}
 
-	override function clear(?color:Vector, ?depth:Float, ?stencil:Int) {
+	override function clear(?color:Vector4, ?depth:Float, ?stencil:Int) {
 		if( color != null ) {
 			var clear = tmp.clearColor;
 			clear.r = color.r;
@@ -1354,7 +1354,7 @@ class DX12Driver extends h3d.impl.Driver {
 
 		var clear = null;
 		if( isRT ) {
-			var color = t.t == null || t.t.color == null ? new h3d.Vector(0,0,0,0) : t.t.color; // reuse prev color
+			var color = t.t == null || t.t.color == null ? new h3d.Vector4(0,0,0,0) : t.t.color; // reuse prev color
 			desc.flags.set(ALLOW_RENDER_TARGET);
 			clear = tmp.clearValue;
 			clear.format = desc.format;

+ 1 - 1
h3d/impl/DirectXDriver.hx

@@ -286,7 +286,7 @@ class DirectXDriver extends h3d.impl.Driver {
 		haxe.Timer.delay(onCreate.bind(false), 1);
 	}
 
-	override function clear(?color:h3d.Vector, ?depth:Float, ?stencil:Int) {
+	override function clear(?color:h3d.Vector4, ?depth:Float, ?stencil:Int) {
 		if( color != null ) {
 			for( i in 0...targetsCount )
 				Driver.clearColor(currentTargets[i], color.r, color.g, color.b, color.a);

+ 1 - 1
h3d/impl/Driver.hx

@@ -159,7 +159,7 @@ class Driver {
 	function logImpl( str : String ) {
 	}
 
-	public function clear( ?color : h3d.Vector, ?depth : Float, ?stencil : Int ) {
+	public function clear( ?color : h3d.Vector4, ?depth : Float, ?stencil : Int ) {
 	}
 
 	public function captureRenderBuffer( pixels : hxd.Pixels ) {

+ 2 - 2
h3d/impl/GlDriver.hx

@@ -130,7 +130,7 @@ class GlDriver extends Driver {
 	var drawMode : Int;
 	var isIntelGpu : Bool;
 
-	static var BLACK = new h3d.Vector(0,0,0,0);
+	static var BLACK = new h3d.Vector4(0,0,0,0);
 
 	/**
 		Perform OUT_OF_MEMORY checks when allocating textures/buffers.
@@ -764,7 +764,7 @@ class GlDriver extends Driver {
 		curStMaskBits = maskBits;
 	}
 
-	override function clear( ?color : h3d.Vector, ?depth : Float, ?stencil : Int ) {
+	override function clear( ?color : h3d.Vector4, ?depth : Float, ?stencil : Int ) {
 		var bits = 0;
 		if( color != null ) {
 			gl.colorMask(true, true, true, true);

+ 1 - 1
h3d/mat/Material.hx

@@ -34,7 +34,7 @@ class Material extends BaseMaterial {
 	public var specularTexture(get, set) : h3d.mat.Texture;
 	public var normalMap(get,set) : h3d.mat.Texture;
 
-	public var color(get, set) : Vector;
+	public var color(get, set) : Vector4;
 	public var specularAmount(get, set) : Float;
 	public var specularPower(get, set) : Float;
 	public var blendMode(default, set) : BlendMode;

+ 1 - 1
h3d/mat/Texture.hx

@@ -247,7 +247,7 @@ class Texture {
 		alloc();
 		if( !flags.has(Target) ) throw "Texture should be target";
 		var engine = h3d.Engine.getCurrent();
-		var color = new h3d.Vector(r,g,b,a);
+		var color = new h3d.Vector4(r,g,b,a);
 		if( layer < 0 ) {
 			for( i in 0...layerCount ) {
 				engine.pushTarget(this, i);

+ 1 - 1
h3d/parts/Emitter.hx

@@ -159,7 +159,7 @@ class Emitter extends Particles implements Randomized {
 		initPosDir(p);
 		if( !state.emitLocal ) {
 			var pos = new h3d.Vector(p.x, p.y, p.z);
-			pos.transform3x4(absPos);
+			pos.transform(absPos);
 			p.x = pos.x;
 			p.y = pos.y;
 			p.z = pos.z;

+ 4 - 4
h3d/pass/CascadeShadowMap.hx

@@ -62,8 +62,8 @@ class CascadeShadowMap extends DirShadowMap {
 		var corners = lightCamera.getFrustumCorners();
 		for ( corner in corners ) {
 			corner.transform(ctx.camera.mcam);
-			shadowNear = hxd.Math.min(shadowNear, corner.z / corner.w);
-			shadowFar = hxd.Math.max(shadowFar, corner.z / corner.w);
+			shadowNear = hxd.Math.min(shadowNear, corner.z);
+			shadowFar = hxd.Math.max(shadowFar, corner.z);
 		}
 		for ( i in 0...cascade - 1 ) {
 			var cascadeBounds = new h3d.col.Bounds();
@@ -106,7 +106,7 @@ class CascadeShadowMap extends DirShadowMap {
 			cshader.cascadeShadowMaps[c] = textures[i];
 			cshader.cascadeProjs[c] = lightCameras[i].m;
 			if ( debugShader )
-				cshader.cascadeDebugs[c] = h3d.Vector.fromColor(debugColors[i]);
+				cshader.cascadeDebugs[c] = h3d.Vector4.fromColor(debugColors[i]);
 			cshader.cascadeBias[c] = params[c] != null ? params[c].bias : 0.001;
 		}
 		cshader.CASCADE_COUNT = cascade;
@@ -166,7 +166,7 @@ class CascadeShadowMap extends DirShadowMap {
 			if( !passes.isEmpty() ) calcShadowBounds(lightCamera);
 			var pt = ctx.camera.pos.clone();
 			pt.transform(lightCamera.mcam);
-			lightCamera.orthoBounds.zMax = pt.z + (castingMaxDist > 0.0 ? castingMaxDist : maxDist < 0.0 ? ctx.camera.zFar : maxDist); 
+			lightCamera.orthoBounds.zMax = pt.z + (castingMaxDist > 0.0 ? castingMaxDist : maxDist < 0.0 ? ctx.camera.zFar : maxDist);
 			lightCamera.orthoBounds.zMin = pt.z - (castingMaxDist > 0.0 ? castingMaxDist : maxDist < 0.0 ? ctx.camera.zFar : maxDist);
 			lightCamera.update();
 		}

+ 2 - 2
h3d/pass/CubeShadowMap.hx

@@ -148,7 +148,7 @@ class CubeShadowMap extends Shadows {
 		return false;
 	}
 
-	var clearDepthColor = new h3d.Vector(1,1,1,1);
+	var clearDepthColor = new h3d.Vector4(1,1,1,1);
 	override function draw( passes : h3d.pass.PassList, ?sort ) {
 		if( !enabled )
 			return;
@@ -179,7 +179,7 @@ class CubeShadowMap extends Shadows {
 		var absPos = light.getAbsPos();
 		lightCamera.pos.set(absPos.tx, absPos.ty, absPos.tz);
 		updateLightCameraNearFar(light);
-		
+
 
 		for( i in 0...6 ) {
 

+ 1 - 1
h3d/pass/Default.hx

@@ -15,7 +15,7 @@ class Default extends Base {
 	@global("camera.zFar") var cameraFar : Float = ctx.camera.zFar;
 	@global("camera.proj") var cameraProj : h3d.Matrix = ctx.camera.mproj;
 	@global("camera.position") var cameraPos : h3d.Vector = ctx.camera.pos;
-	@global("camera.projDiag") var cameraProjDiag : h3d.Vector = new h3d.Vector(ctx.camera.mproj._11,ctx.camera.mproj._22,ctx.camera.mproj._33,ctx.camera.mproj._44);
+	@global("camera.projDiag") var cameraProjDiag : h3d.Vector4 = new h3d.Vector4(ctx.camera.mproj._11,ctx.camera.mproj._22,ctx.camera.mproj._33,ctx.camera.mproj._44);
 	@global("camera.projFlip") var cameraProjFlip : Float = ctx.engine.driver.hasFeature(BottomLeftCoords) && ctx.engine.getCurrentTarget() != null ? -1 : 1;
 	@global("camera.viewProj") var cameraViewProj : h3d.Matrix = ctx.camera.m;
 	@global("camera.inverseViewProj") var cameraInverseViewProj : h3d.Matrix = ctx.camera.getInverseViewProj();

+ 10 - 8
h3d/pass/ShaderManager.hx

@@ -32,17 +32,19 @@ class ShaderManager {
 		case TFloat:
 			out[pos] = v;
 			return 1;
+		case TVec(4, _):
+			var v : hxsl.Types.Vec4 = v;
+			out[pos++] = v.x;
+			out[pos++] = v.y;
+			out[pos++] = v.z;
+			out[pos++] = v.w;
+			return 4;
 		case TVec(n, _):
-			var v : h3d.Vector = v;
+			var v : hxsl.Types.Vec = v;
 			out[pos++] = v.x;
 			out[pos++] = v.y;
-			switch( n ) {
-			case 3:
+			if( n == 3 )
 				out[pos++] = v.z;
-			case 4:
-				out[pos++] = v.z;
-				out[pos++] = v.w;
-			}
 			return n;
 		case TMat4:
 			var m : h3d.Matrix = v;
@@ -94,7 +96,7 @@ class ShaderManager {
 			out[pos++] = 0;
 			return 12;
 		case TArray(TVec(4,VFloat), SConst(len)):
-			var v : Array<h3d.Vector> = v;
+			var v : Array<h3d.Vector4> = v;
 			for( i in 0...len ) {
 				var n = v[i];
 				if( n == null ) break;

+ 6 - 7
h3d/scene/CameraController.hx

@@ -30,9 +30,9 @@ class CameraController extends h3d.scene.Object {
 	var moveY = 0.;
 	var pushTime : Float;
 	var curPos = new h3d.Vector();
-	var curOffset = new h3d.Vector();
+	var curOffset = new h3d.Vector4();
 	var targetPos = new h3d.Vector(10. / 25., Math.PI / 4, Math.PI * 5 / 13);
-	var targetOffset = new h3d.Vector(0, 0, 0, 0);
+	var targetOffset = new h3d.Vector4(0, 0, 0, 0);
 
 	public function new(?distance,?parent) {
 		super(parent);
@@ -47,7 +47,7 @@ class CameraController extends h3d.scene.Object {
 	inline function get_theta() return curPos.y;
 	inline function get_phi() return curPos.z;
 	inline function get_fovY() return curOffset.w;
-	inline function get_target() return curOffset.toPoint();
+	inline function get_target() return curOffset.toVector();
 
 	/**
 		Set the controller parameters.
@@ -75,7 +75,7 @@ class CameraController extends h3d.scene.Object {
 	public function loadFromCamera( animate = false ) {
 		var scene = if( scene == null ) getScene() else scene;
 		if( scene == null ) throw "Not in scene";
-		targetOffset.load(scene.camera.target);
+		targetOffset.set(scene.camera.target.x, scene.camera.target.y, scene.camera.target.z);
 		targetOffset.w = scene.camera.fovY;
 
 		var pos = scene.camera.pos.sub(scene.camera.target);
@@ -228,7 +228,7 @@ class CameraController extends h3d.scene.Object {
 	}
 
 	function pan(dx, dy, dz = 0.) {
-		var v = new h3d.Vector(dx, dy, dz);
+		var v = new h3d.Vector4(dx, dy, dz);
 		scene.camera.update();
 		v.transform3x3(scene.camera.getInverseView());
 		v.w = 0;
@@ -238,8 +238,7 @@ class CameraController extends h3d.scene.Object {
 	function syncCamera() {
 		var cam = getScene().camera;
 		var distance = distance;
-		cam.target.load(curOffset);
-		cam.target.w = 1;
+		cam.target.load(curOffset.toVector());
 		cam.pos.set(
 			distance * Math.cos(theta) * Math.sin(phi) + cam.target.x,
 			distance * Math.sin(theta) * Math.sin(phi) + cam.target.y,

+ 1 - 1
h3d/scene/Interactive.hx

@@ -57,7 +57,7 @@ class Interactive extends Object implements hxd.SceneEvents.Interactive {
 	var lastClickFrame : Int = -1;
 
 	@:allow(h3d.scene.Scene)
-	var hitPoint = new h3d.Vector();
+	var hitPoint = new h3d.Vector4();
 
 	public function new(shape, ?parent) {
 		super(parent);

+ 6 - 5
h3d/scene/MeshBatch.hx

@@ -237,21 +237,22 @@ class MeshBatch extends MultiMaterial {
 			}
 			var curShader = shaders[p.instance];
 			switch( p.type ) {
+			case TVec(4, _):
+				var v : h3d.Vector4 = curShader.getParamValue(p.index);
+				buf[pos++] = v.x;
+				buf[pos++] = v.y;
+				buf[pos++] = v.z;
+				buf[pos++] = v.w;
 			case TVec(size, _):
 				var v : h3d.Vector = curShader.getParamValue(p.index);
 				switch( size ) {
 				case 2:
 					buf[pos++] = v.x;
 					buf[pos++] = v.y;
-				case 3:
-					buf[pos++] = v.x;
-					buf[pos++] = v.y;
-					buf[pos++] = v.z;
 				default:
 					buf[pos++] = v.x;
 					buf[pos++] = v.y;
 					buf[pos++] = v.z;
-					buf[pos++] = v.w;
 				}
 			case TFloat:
 				buf[pos++] = curShader.getParamFloatValue(p.index);

+ 2 - 2
h3d/scene/World.hx

@@ -251,7 +251,7 @@ class World extends Object {
 			defaults : [],
 		};
 		if(enableNormalMaps) {
-			r.defaults[2] = new h3d.Vector(1,0,0);
+			r.defaults[2] = new h3d.Vector4(1,0,0);
 			r.fmt = r.fmt.append("tangent", DVec3);
 		}
 		r.fmt = r.fmt.append("uv", DVec2);
@@ -455,7 +455,7 @@ class World extends Object {
 
 					// position
 					var pt = new h3d.Vector(x,y,z);
-					pt.transform3x4(pos);
+					pt.transform(pos);
 					model.buf.push(pt.x);
 					model.buf.push(pt.y);
 					model.buf.push(pt.z);

+ 1 - 1
h3d/scene/pbr/Light.hx

@@ -12,7 +12,7 @@ class Light extends h3d.scene.Light {
 
 	function new(shader,?parent) {
 		super(shader,parent);
-		_color = new h3d.Vector(1,1,1,1);
+		_color = new h3d.Vector(1,1,1);
 		if( shadows == null ) shadows = new h3d.pass.Shadows(this);
 	}
 

+ 1 - 1
h3d/scene/pbr/LightBuffer.hx

@@ -86,7 +86,7 @@ class LightBuffer {
 		b[i+0] = v.r;
 		b[i+1] = v.g;
 		b[i+2] = v.b;
-		b[i+3] = v.a;
+		b[i+3] = 1;
 	}
 
 	function sortingCriteria ( l1 : Light, l2 : Light, cameraTarget : Vector ) {

+ 1 - 1
h3d/scene/pbr/Renderer.hx

@@ -539,7 +539,7 @@ class Renderer extends h3d.scene.Renderer {
 	override function render() {
 		beginPbr();
 		setTarget(textures.depth);
-		ctx.engine.clearF(new h3d.Vector(1));
+		ctx.engine.clearF(new h3d.Vector4(1));
 
 		setTargets(getPbrRenderTargets(false));
 		clear(0, 1, 0);

+ 80 - 80
h3d/shader/DirShadow.hx

@@ -73,90 +73,90 @@ class DirShadow extends hxsl.Shader {
 	function set_pcfQuality(q: Int) {
 		poissonDisk = switch(q) {
 		default: [
-			new h3d.Vector(-0.942,-0.399 ),
-			new h3d.Vector( 0.945,-0.768 ),
-			new h3d.Vector(-0.094,-0.929 ),
-			new h3d.Vector( 0.344, 0.293 ) ];
+			new h3d.Vector4(-0.942,-0.399 ),
+			new h3d.Vector4( 0.945,-0.768 ),
+			new h3d.Vector4(-0.094,-0.929 ),
+			new h3d.Vector4( 0.344, 0.293 ) ];
 
 		case 2: [
-			new h3d.Vector(-0.326,-0.406),
-			new h3d.Vector(-0.840,-0.074),
-			new h3d.Vector(-0.696, 0.457),
-			new h3d.Vector(-0.203, 0.621),
-			new h3d.Vector( 0.962,-0.195),
-			new h3d.Vector( 0.473,-0.480),
-			new h3d.Vector( 0.519, 0.767),
-			new h3d.Vector( 0.185,-0.893),
-			new h3d.Vector( 0.507, 0.064),
-			new h3d.Vector( 0.896, 0.412),
-			new h3d.Vector(-0.322,-0.933),
-			new h3d.Vector(-0.792,-0.598) ];
+			new h3d.Vector4(-0.326,-0.406),
+			new h3d.Vector4(-0.840,-0.074),
+			new h3d.Vector4(-0.696, 0.457),
+			new h3d.Vector4(-0.203, 0.621),
+			new h3d.Vector4( 0.962,-0.195),
+			new h3d.Vector4( 0.473,-0.480),
+			new h3d.Vector4( 0.519, 0.767),
+			new h3d.Vector4( 0.185,-0.893),
+			new h3d.Vector4( 0.507, 0.064),
+			new h3d.Vector4( 0.896, 0.412),
+			new h3d.Vector4(-0.322,-0.933),
+			new h3d.Vector4(-0.792,-0.598) ];
 
 		case 3: [
-			new h3d.Vector(-0.613392, 0.617481),
-			new h3d.Vector(0.170019, -0.040254),
-			new h3d.Vector(-0.299417, 0.791925),
-			new h3d.Vector(0.645680, 0.493210),
-			new h3d.Vector(-0.651784, 0.717887),
-			new h3d.Vector(0.421003, 0.027070),
-			new h3d.Vector(-0.817194, -0.271096),
-			new h3d.Vector(-0.705374, -0.668203),
-			new h3d.Vector(0.977050, -0.108615),
-			new h3d.Vector(0.063326, 0.142369),
-			new h3d.Vector(0.203528, 0.214331),
-			new h3d.Vector(-0.667531, 0.326090),
-			new h3d.Vector(-0.098422, -0.295755),
-			new h3d.Vector(-0.885922, 0.215369),
-			new h3d.Vector(0.566637, 0.605213),
-			new h3d.Vector(0.039766, -0.396100),
-			new h3d.Vector(0.751946, 0.453352),
-			new h3d.Vector(0.078707, -0.715323),
-			new h3d.Vector(-0.075838, -0.529344),
-			new h3d.Vector(0.724479, -0.580798),
-			new h3d.Vector(0.222999, -0.215125),
-			new h3d.Vector(-0.467574, -0.405438),
-			new h3d.Vector(-0.248268, -0.814753),
-			new h3d.Vector(0.354411, -0.887570),
-			new h3d.Vector(0.175817, 0.382366),
-			new h3d.Vector(0.487472, -0.063082),
-			new h3d.Vector(-0.084078, 0.898312),
-			new h3d.Vector(0.488876, -0.783441),
-			new h3d.Vector(0.470016, 0.217933),
-			new h3d.Vector(-0.696890, -0.549791),
-			new h3d.Vector(-0.149693, 0.605762),
-			new h3d.Vector(0.034211, 0.979980),
-			new h3d.Vector(0.503098, -0.308878),
-			new h3d.Vector(-0.016205, -0.872921),
-			new h3d.Vector(0.385784, -0.393902),
-			new h3d.Vector(-0.146886, -0.859249),
-			new h3d.Vector(0.643361, 0.164098),
-			new h3d.Vector(0.634388, -0.049471),
-			new h3d.Vector(-0.688894, 0.007843),
-			new h3d.Vector(0.464034, -0.188818),
-			new h3d.Vector(-0.440840, 0.137486),
-			new h3d.Vector(0.364483, 0.511704),
-			new h3d.Vector(0.034028, 0.325968),
-			new h3d.Vector(0.099094, -0.308023),
-			new h3d.Vector(0.693960, -0.366253),
-			new h3d.Vector(0.678884, -0.204688),
-			new h3d.Vector(0.001801, 0.780328),
-			new h3d.Vector(0.145177, -0.898984),
-			new h3d.Vector(0.062655, -0.611866),
-			new h3d.Vector(0.315226, -0.604297),
-			new h3d.Vector(-0.780145, 0.486251),
-			new h3d.Vector(-0.371868, 0.882138),
-			new h3d.Vector(0.200476, 0.494430),
-			new h3d.Vector(-0.494552, -0.711051),
-			new h3d.Vector(0.612476, 0.705252),
-			new h3d.Vector(-0.578845, -0.768792),
-			new h3d.Vector(-0.772454, -0.090976),
-			new h3d.Vector(0.504440, 0.372295),
-			new h3d.Vector(0.155736, 0.065157),
-			new h3d.Vector(0.391522, 0.849605),
-			new h3d.Vector(-0.620106, -0.328104),
-			new h3d.Vector(0.789239, -0.419965),
-			new h3d.Vector(-0.545396, 0.538133),
-			new h3d.Vector(-0.178564, -0.596057) ];
+			new h3d.Vector4(-0.613392, 0.617481),
+			new h3d.Vector4(0.170019, -0.040254),
+			new h3d.Vector4(-0.299417, 0.791925),
+			new h3d.Vector4(0.645680, 0.493210),
+			new h3d.Vector4(-0.651784, 0.717887),
+			new h3d.Vector4(0.421003, 0.027070),
+			new h3d.Vector4(-0.817194, -0.271096),
+			new h3d.Vector4(-0.705374, -0.668203),
+			new h3d.Vector4(0.977050, -0.108615),
+			new h3d.Vector4(0.063326, 0.142369),
+			new h3d.Vector4(0.203528, 0.214331),
+			new h3d.Vector4(-0.667531, 0.326090),
+			new h3d.Vector4(-0.098422, -0.295755),
+			new h3d.Vector4(-0.885922, 0.215369),
+			new h3d.Vector4(0.566637, 0.605213),
+			new h3d.Vector4(0.039766, -0.396100),
+			new h3d.Vector4(0.751946, 0.453352),
+			new h3d.Vector4(0.078707, -0.715323),
+			new h3d.Vector4(-0.075838, -0.529344),
+			new h3d.Vector4(0.724479, -0.580798),
+			new h3d.Vector4(0.222999, -0.215125),
+			new h3d.Vector4(-0.467574, -0.405438),
+			new h3d.Vector4(-0.248268, -0.814753),
+			new h3d.Vector4(0.354411, -0.887570),
+			new h3d.Vector4(0.175817, 0.382366),
+			new h3d.Vector4(0.487472, -0.063082),
+			new h3d.Vector4(-0.084078, 0.898312),
+			new h3d.Vector4(0.488876, -0.783441),
+			new h3d.Vector4(0.470016, 0.217933),
+			new h3d.Vector4(-0.696890, -0.549791),
+			new h3d.Vector4(-0.149693, 0.605762),
+			new h3d.Vector4(0.034211, 0.979980),
+			new h3d.Vector4(0.503098, -0.308878),
+			new h3d.Vector4(-0.016205, -0.872921),
+			new h3d.Vector4(0.385784, -0.393902),
+			new h3d.Vector4(-0.146886, -0.859249),
+			new h3d.Vector4(0.643361, 0.164098),
+			new h3d.Vector4(0.634388, -0.049471),
+			new h3d.Vector4(-0.688894, 0.007843),
+			new h3d.Vector4(0.464034, -0.188818),
+			new h3d.Vector4(-0.440840, 0.137486),
+			new h3d.Vector4(0.364483, 0.511704),
+			new h3d.Vector4(0.034028, 0.325968),
+			new h3d.Vector4(0.099094, -0.308023),
+			new h3d.Vector4(0.693960, -0.366253),
+			new h3d.Vector4(0.678884, -0.204688),
+			new h3d.Vector4(0.001801, 0.780328),
+			new h3d.Vector4(0.145177, -0.898984),
+			new h3d.Vector4(0.062655, -0.611866),
+			new h3d.Vector4(0.315226, -0.604297),
+			new h3d.Vector4(-0.780145, 0.486251),
+			new h3d.Vector4(-0.371868, 0.882138),
+			new h3d.Vector4(0.200476, 0.494430),
+			new h3d.Vector4(-0.494552, -0.711051),
+			new h3d.Vector4(0.612476, 0.705252),
+			new h3d.Vector4(-0.578845, -0.768792),
+			new h3d.Vector4(-0.772454, -0.090976),
+			new h3d.Vector4(0.504440, 0.372295),
+			new h3d.Vector4(0.155736, 0.065157),
+			new h3d.Vector4(0.391522, 0.849605),
+			new h3d.Vector4(-0.620106, -0.328104),
+			new h3d.Vector4(0.789239, -0.419965),
+			new h3d.Vector4(-0.545396, 0.538133),
+			new h3d.Vector4(-0.178564, -0.596057) ];
 		}
 		PCF_SAMPLES = poissonDisk.length;
 		return q;

+ 80 - 80
h3d/shader/SpotShadow.hx

@@ -94,88 +94,88 @@ class SpotShadow extends hxsl.Shader {
 
 	public function new() {
 		super();
-		poissonDiskLow = [	new h3d.Vector(-0.942,-0.399 ),
-							new h3d.Vector( 0.945,-0.768 ),
-							new h3d.Vector(-0.094,-0.929 ),
-							new h3d.Vector( 0.344, 0.293 ) ];
+		poissonDiskLow = [	new h3d.Vector4(-0.942,-0.399 ),
+							new h3d.Vector4( 0.945,-0.768 ),
+							new h3d.Vector4(-0.094,-0.929 ),
+							new h3d.Vector4( 0.344, 0.293 ) ];
 
-		poissonDiskHigh = [	new h3d.Vector(-0.326,-0.406),
-							new h3d.Vector(-0.840,-0.074),
-							new h3d.Vector(-0.696, 0.457),
-							new h3d.Vector(-0.203, 0.621),
-							new h3d.Vector( 0.962,-0.195),
-							new h3d.Vector( 0.473,-0.480),
-							new h3d.Vector( 0.519, 0.767),
-							new h3d.Vector( 0.185,-0.893),
-							new h3d.Vector( 0.507, 0.064),
-							new h3d.Vector( 0.896, 0.412),
-							new h3d.Vector(-0.322,-0.933),
-							new h3d.Vector(-0.792,-0.598) ];
+		poissonDiskHigh = [	new h3d.Vector4(-0.326,-0.406),
+							new h3d.Vector4(-0.840,-0.074),
+							new h3d.Vector4(-0.696, 0.457),
+							new h3d.Vector4(-0.203, 0.621),
+							new h3d.Vector4( 0.962,-0.195),
+							new h3d.Vector4( 0.473,-0.480),
+							new h3d.Vector4( 0.519, 0.767),
+							new h3d.Vector4( 0.185,-0.893),
+							new h3d.Vector4( 0.507, 0.064),
+							new h3d.Vector4( 0.896, 0.412),
+							new h3d.Vector4(-0.322,-0.933),
+							new h3d.Vector4(-0.792,-0.598) ];
 
-		poissonDiskVeryHigh = [	new h3d.Vector(-0.613392, 0.617481),
-								new h3d.Vector(0.170019, -0.040254),
-								new h3d.Vector(-0.299417, 0.791925),
-								new h3d.Vector(0.645680, 0.493210),
-								new h3d.Vector(-0.651784, 0.717887),
-								new h3d.Vector(0.421003, 0.027070),
-								new h3d.Vector(-0.817194, -0.271096),
-								new h3d.Vector(-0.705374, -0.668203),
-								new h3d.Vector(0.977050, -0.108615),
-								new h3d.Vector(0.063326, 0.142369),
-								new h3d.Vector(0.203528, 0.214331),
-								new h3d.Vector(-0.667531, 0.326090),
-								new h3d.Vector(-0.098422, -0.295755),
-								new h3d.Vector(-0.885922, 0.215369),
-								new h3d.Vector(0.566637, 0.605213),
-								new h3d.Vector(0.039766, -0.396100),
-								new h3d.Vector(0.751946, 0.453352),
-								new h3d.Vector(0.078707, -0.715323),
-								new h3d.Vector(-0.075838, -0.529344),
-								new h3d.Vector(0.724479, -0.580798),
-								new h3d.Vector(0.222999, -0.215125),
-								new h3d.Vector(-0.467574, -0.405438),
-								new h3d.Vector(-0.248268, -0.814753),
-								new h3d.Vector(0.354411, -0.887570),
-								new h3d.Vector(0.175817, 0.382366),
-								new h3d.Vector(0.487472, -0.063082),
-								new h3d.Vector(-0.084078, 0.898312),
-								new h3d.Vector(0.488876, -0.783441),
-								new h3d.Vector(0.470016, 0.217933),
-								new h3d.Vector(-0.696890, -0.549791),
-								new h3d.Vector(-0.149693, 0.605762),
-								new h3d.Vector(0.034211, 0.979980),
-								new h3d.Vector(0.503098, -0.308878),
-								new h3d.Vector(-0.016205, -0.872921),
-								new h3d.Vector(0.385784, -0.393902),
-								new h3d.Vector(-0.146886, -0.859249),
-								new h3d.Vector(0.643361, 0.164098),
-								new h3d.Vector(0.634388, -0.049471),
-								new h3d.Vector(-0.688894, 0.007843),
-								new h3d.Vector(0.464034, -0.188818),
-								new h3d.Vector(-0.440840, 0.137486),
-								new h3d.Vector(0.364483, 0.511704),
-								new h3d.Vector(0.034028, 0.325968),
-								new h3d.Vector(0.099094, -0.308023),
-								new h3d.Vector(0.693960, -0.366253),
-								new h3d.Vector(0.678884, -0.204688),
-								new h3d.Vector(0.001801, 0.780328),
-								new h3d.Vector(0.145177, -0.898984),
-								new h3d.Vector(0.062655, -0.611866),
-								new h3d.Vector(0.315226, -0.604297),
-								new h3d.Vector(-0.780145, 0.486251),
-								new h3d.Vector(-0.371868, 0.882138),
-								new h3d.Vector(0.200476, 0.494430),
-								new h3d.Vector(-0.494552, -0.711051),
-								new h3d.Vector(0.612476, 0.705252),
-								new h3d.Vector(-0.578845, -0.768792),
-								new h3d.Vector(-0.772454, -0.090976),
-								new h3d.Vector(0.504440, 0.372295),
-								new h3d.Vector(0.155736, 0.065157),
-								new h3d.Vector(0.391522, 0.849605),
-								new h3d.Vector(-0.620106, -0.328104),
-								new h3d.Vector(0.789239, -0.419965),
-								new h3d.Vector(-0.545396, 0.538133),
-								new h3d.Vector(-0.178564, -0.596057) ];
+		poissonDiskVeryHigh = [	new h3d.Vector4(-0.613392, 0.617481),
+								new h3d.Vector4(0.170019, -0.040254),
+								new h3d.Vector4(-0.299417, 0.791925),
+								new h3d.Vector4(0.645680, 0.493210),
+								new h3d.Vector4(-0.651784, 0.717887),
+								new h3d.Vector4(0.421003, 0.027070),
+								new h3d.Vector4(-0.817194, -0.271096),
+								new h3d.Vector4(-0.705374, -0.668203),
+								new h3d.Vector4(0.977050, -0.108615),
+								new h3d.Vector4(0.063326, 0.142369),
+								new h3d.Vector4(0.203528, 0.214331),
+								new h3d.Vector4(-0.667531, 0.326090),
+								new h3d.Vector4(-0.098422, -0.295755),
+								new h3d.Vector4(-0.885922, 0.215369),
+								new h3d.Vector4(0.566637, 0.605213),
+								new h3d.Vector4(0.039766, -0.396100),
+								new h3d.Vector4(0.751946, 0.453352),
+								new h3d.Vector4(0.078707, -0.715323),
+								new h3d.Vector4(-0.075838, -0.529344),
+								new h3d.Vector4(0.724479, -0.580798),
+								new h3d.Vector4(0.222999, -0.215125),
+								new h3d.Vector4(-0.467574, -0.405438),
+								new h3d.Vector4(-0.248268, -0.814753),
+								new h3d.Vector4(0.354411, -0.887570),
+								new h3d.Vector4(0.175817, 0.382366),
+								new h3d.Vector4(0.487472, -0.063082),
+								new h3d.Vector4(-0.084078, 0.898312),
+								new h3d.Vector4(0.488876, -0.783441),
+								new h3d.Vector4(0.470016, 0.217933),
+								new h3d.Vector4(-0.696890, -0.549791),
+								new h3d.Vector4(-0.149693, 0.605762),
+								new h3d.Vector4(0.034211, 0.979980),
+								new h3d.Vector4(0.503098, -0.308878),
+								new h3d.Vector4(-0.016205, -0.872921),
+								new h3d.Vector4(0.385784, -0.393902),
+								new h3d.Vector4(-0.146886, -0.859249),
+								new h3d.Vector4(0.643361, 0.164098),
+								new h3d.Vector4(0.634388, -0.049471),
+								new h3d.Vector4(-0.688894, 0.007843),
+								new h3d.Vector4(0.464034, -0.188818),
+								new h3d.Vector4(-0.440840, 0.137486),
+								new h3d.Vector4(0.364483, 0.511704),
+								new h3d.Vector4(0.034028, 0.325968),
+								new h3d.Vector4(0.099094, -0.308023),
+								new h3d.Vector4(0.693960, -0.366253),
+								new h3d.Vector4(0.678884, -0.204688),
+								new h3d.Vector4(0.001801, 0.780328),
+								new h3d.Vector4(0.145177, -0.898984),
+								new h3d.Vector4(0.062655, -0.611866),
+								new h3d.Vector4(0.315226, -0.604297),
+								new h3d.Vector4(-0.780145, 0.486251),
+								new h3d.Vector4(-0.371868, 0.882138),
+								new h3d.Vector4(0.200476, 0.494430),
+								new h3d.Vector4(-0.494552, -0.711051),
+								new h3d.Vector4(0.612476, 0.705252),
+								new h3d.Vector4(-0.578845, -0.768792),
+								new h3d.Vector4(-0.772454, -0.090976),
+								new h3d.Vector4(0.504440, 0.372295),
+								new h3d.Vector4(0.155736, 0.065157),
+								new h3d.Vector4(0.391522, 0.849605),
+								new h3d.Vector4(-0.620106, -0.328104),
+								new h3d.Vector4(0.789239, -0.419965),
+								new h3d.Vector4(-0.545396, 0.538133),
+								new h3d.Vector4(-0.178564, -0.596057) ];
 	}
 }
 

+ 9 - 9
hxd/Pixels.hx

@@ -27,15 +27,15 @@ abstract PixelsARGB(Pixels) to Pixels {
 @:access(hxd.Pixels)
 abstract PixelsFloat(Pixels) to Pixels {
 
-	public inline function getPixelF(x, y, ?v:h3d.Vector) {
+	public inline function getPixelF(x, y, ?v:h3d.Vector4) {
 		if( v == null )
-			v = new h3d.Vector();
+			v = new h3d.Vector4();
 		var pix = ((x + y * this.width) << 2) + this.offset;
 		v.x = this.bytes.getFloat(pix);
 		return v;
 	}
 
-	public inline function setPixelF(x, y, v:h3d.Vector) {
+	public inline function setPixelF(x, y, v:h3d.Vector4) {
 		var pix = ((x + y * this.width) << 2) + this.offset;
 		this.bytes.setFloat(pix, v.x);
 	}
@@ -51,9 +51,9 @@ abstract PixelsFloat(Pixels) to Pixels {
 @:access(hxd.Pixels)
 abstract PixelsFloatRGBA(Pixels) to Pixels {
 
-	public inline function getPixelF(x, y, ?v:h3d.Vector) {
+	public inline function getPixelF(x, y, ?v:h3d.Vector4) {
 		if( v == null )
-			v = new h3d.Vector();
+			v = new h3d.Vector4();
 		var pix = ((x + y * this.width) << 4) + this.offset;
 		v.x = this.bytes.getFloat(pix);
 		v.y = this.bytes.getFloat(pix+4);
@@ -62,7 +62,7 @@ abstract PixelsFloatRGBA(Pixels) to Pixels {
 		return v;
 	}
 
-	public inline function setPixelF(x, y, v:h3d.Vector) {
+	public inline function setPixelF(x, y, v:h3d.Vector4) {
 		var pix = ((x + y * this.width) << 4) + this.offset;
 		this.bytes.setFloat(pix, v.x);
 		this.bytes.setFloat(pix+4, v.y);
@@ -452,9 +452,9 @@ class Pixels {
 		}
 	}
 
-	public function getPixelF(x, y, ?v:h3d.Vector) {
+	public function getPixelF(x, y, ?v:h3d.Vector4) {
 		if( v == null )
-			v = new h3d.Vector();
+			v = new h3d.Vector4();
 		var p = ((x + y * width) * bytesPerPixel) + offset;
 		switch( format ) {
 		case R32F:
@@ -475,7 +475,7 @@ class Pixels {
 		}
 	}
 
-	public function setPixelF(x, y, v:h3d.Vector) {
+	public function setPixelF(x, y, v:h3d.Vector4) {
 		willChange();
 		var p = ((x + y * width) * bytesPerPixel) + offset;
 		switch( format ) {

+ 4 - 4
hxd/fmt/hmd/Library.hx

@@ -5,7 +5,7 @@ private class FormatMap {
 	public var size : Int;
 	public var offset : Int;
 	public var precision : hxd.BufferFormat.Precision;
-	public var def : h3d.Vector;
+	public var def : h3d.Vector4;
 	public function new(size, offset, def, prec) {
 		this.size = size;
 		this.offset = offset;
@@ -66,7 +66,7 @@ class Library {
 		return { format : hxd.BufferFormat.make(format), defs : defs };
 	}
 
-	public function load( format : hxd.BufferFormat, ?defaults : Array<h3d.Vector>, modelIndex = -1 ) {
+	public function load( format : hxd.BufferFormat, ?defaults : Array<h3d.Vector4>, modelIndex = -1 ) {
 		var vtmp = new h3d.Vector();
 		var models = modelIndex < 0 ? header.models : [header.models[modelIndex]];
 		var outVertex = new hxd.FloatBuffer();
@@ -88,7 +88,7 @@ class Library {
 				vtmp.x = data.vertexes[p++];
 				vtmp.y = data.vertexes[p++];
 				vtmp.z = data.vertexes[p++];
-				vtmp.transform3x4(pos);
+				vtmp.transform(pos);
 				outVertex.push(vtmp.x);
 				outVertex.push(vtmp.y);
 				outVertex.push(vtmp.z);
@@ -102,7 +102,7 @@ class Library {
 	}
 
 	@:noDebug
-	public function getBuffers( geom : Geometry, format : hxd.BufferFormat, ?defaults : Array<h3d.Vector>, ?material : Int ) {
+	public function getBuffers( geom : Geometry, format : hxd.BufferFormat, ?defaults : Array<h3d.Vector4>, ?material : Int ) {
 
 		if( material == 0 && geom.indexCounts.length == 1 )
 			material = null;

+ 4 - 4
hxd/fmt/spine/Data.hx

@@ -29,20 +29,20 @@ class Slot {
 	public var name : String;
 	public var bone : Bone;
 	public var attachment : String;
-	public var color : h3d.Vector;
+	public var color : h3d.Vector4;
 	public var blendMode : h2d.BlendMode;
 
 	public function new() {
-		color = new h3d.Vector(1, 1, 1, 1);
+		color = new h3d.Vector4(1, 1, 1, 1);
 	}
 }
 
 class Attachment {
 	public var skin : Skin;
 	public var slot : Slot;
-	public var color : h3d.Vector;
+	public var color : h3d.Vector4;
 	public function new() {
-		color = new h3d.Vector(1, 1, 1, 1);
+		color = new h3d.Vector4(1, 1, 1, 1);
 	}
 }
 

+ 10 - 2
hxd/impl/Properties.hx

@@ -42,15 +42,23 @@ class Properties {
 					if( v.length >= 1 ) vprev.x = v[0];
 					if( v.length >= 2 ) vprev.y = v[1];
 					if( v.length >= 3 ) vprev.z = v[2];
+					continue;
+				case TClass(h3d.Vector4.Vector4Impl):
+					var v : Array<Float> = v;
+					var vprev : h3d.Vector4 = vprev;
+					vprev.set();
+					if( v.length >= 1 ) vprev.x = v[0];
+					if( v.length >= 2 ) vprev.y = v[1];
+					if( v.length >= 3 ) vprev.z = v[2];
 					if( v.length >= 4 ) vprev.w = v[3];
 					continue;
 				default:
 				}
 			case TClass(String):
 				switch( Type.typeof(vprev) ) {
-				case TClass(h3d.Vector.VectorImpl):
+				case TClass(h3d.Vector4.Vector4Impl):
 					var v : String = v;
-					var vprev : h3d.Vector = vprev;
+					var vprev : h3d.Vector4 = vprev;
 					if( v.charCodeAt(0) == '#'.code )  {
 						var color = Std.parseInt("0x" + v.substr(1));
 						vprev.set(

+ 12 - 12
hxd/res/Gradients.hx

@@ -58,13 +58,13 @@ class Gradients extends Resource {
 	}
 
 	static function appendPixels(pixels : hxd.Pixels, dat : Gradient, wid : Int, hei : Int, yoff : Int) {
-		var colors = new Array<{value : h3d.Vector, loc : Int}>();
+		var colors = new Array<{value : h3d.Vector4, loc : Int}>();
 
 		{	// preprocess gradient data
 			for (cs in dat.gradientStops) {
-				var color : h3d.Vector;
+				var color : h3d.Vector4;
 				switch(cs.colorStop.color) {
-					case RGB(r, g, b): color = new h3d.Vector(r / 255, g / 255, b / 255);
+					case RGB(r, g, b): color = new h3d.Vector4(r / 255, g / 255, b / 255);
 					case HSB(h, s, b): color = HSVtoRGB(h, s / 100, b / 100);
 					default : throw "unhandled color type";
 				}
@@ -82,7 +82,7 @@ class Gradients extends Resource {
 		{	// create gradient pixels
 			var px = 0;
 			var ci = 0; // color index
-			var tmpCol = new h3d.Vector();
+			var tmpCol = new h3d.Vector4();
 
 			while (px < wid) {
 				var prevLoc = colors[ci    ].loc;
@@ -101,12 +101,12 @@ class Gradients extends Resource {
 		}
 	}
 
-	static function HSVtoRGB(h : Float, s : Float, v : Float) : h3d.Vector
+	static function HSVtoRGB(h : Float, s : Float, v : Float) : h3d.Vector4
 	{
 		var i : Int;
 		var f : Float; var p : Float; var q : Float; var t : Float;
 		if( s == 0 )
-			return new h3d.Vector(v, v, v);
+			return new h3d.Vector4(v, v, v);
 		h /= 60;
 		i = Math.floor( h );
 		f = h - i;
@@ -114,12 +114,12 @@ class Gradients extends Resource {
 		q = v * ( 1 - s * f );
 		t = v * ( 1 - s * ( 1 - f ) );
 		switch( i ) {
-			case 0 : return new h3d.Vector(v, t, p);
-			case 1 : return new h3d.Vector(q, v, p);
-			case 2 : return new h3d.Vector(p, v, t);
-			case 3 : return new h3d.Vector(p, q, v);
-			case 4 : return new h3d.Vector(t, p, v);
-			default: return new h3d.Vector(v, p, q);
+			case 0 : return new h3d.Vector4(v, t, p);
+			case 1 : return new h3d.Vector4(q, v, p);
+			case 2 : return new h3d.Vector4(p, v, t);
+			case 3 : return new h3d.Vector4(p, q, v);
+			case 4 : return new h3d.Vector4(t, p, v);
+			default: return new h3d.Vector4(v, p, q);
 		}
 	}
 

+ 8 - 3
hxsl/Ast.hx

@@ -561,11 +561,16 @@ class Tools {
 			case CFloat(f): f;
 			case CString(s): s;
 			}
-		case TCall({ e : TGlobal(Vec2 | Vec3 | Vec4) }, args):
+		case TCall({ e : TGlobal(Vec4) }, args):
 			var vals = [for( a in args ) evalConst(a)];
 			if( vals.length == 1 )
-				return new Types.Vec(vals[0], vals[0], vals[0], vals[0]);
-			return new Types.Vec(vals[0], vals[1], vals[2], vals[3]);
+				return new Types.Vec4(vals[0], vals[0], vals[0], vals[0]);
+			return new Types.Vec4(vals[0], vals[1], vals[2], vals[3]);
+		case TCall({ e : TGlobal(Vec2 | Vec3) }, args):
+			var vals = [for( a in args ) evalConst(a)];
+			if( vals.length == 1 )
+				return new Types.Vec(vals[0], vals[0], vals[0]);
+			return new Types.Vec(vals[0], vals[1], vals[2]);
 		default:
 			throw "Unhandled constant init " + Printer.toString(e);
 		}

+ 2 - 0
hxsl/DynamicShader.hx

@@ -59,6 +59,8 @@ class DynamicShader extends Shader {
 		}
 		var value : Dynamic = null;
 		switch( v.type ) {
+		case TVec(4,_):
+			value = new h3d.Vector4();
 		case TVec(_):
 			value = new h3d.Vector();
 		case TMat3, TMat4, TMat3x4:

+ 5 - 5
hxsl/Macros.hx

@@ -8,10 +8,10 @@ class Macros {
 	static function makeType( t : Type ) : ComplexType {
 		return switch( t ) {
 		case TVoid: macro : Void;
-		case TVec(_, t):
+		case TVec(n, t):
 			switch( t ) {
 			case VFloat:
-				macro : hxsl.Types.Vec;
+				n == 4 ? (macro : hxsl.Types.Vec4) : (macro : hxsl.Types.Vec);
 			case VInt:
 				macro : hxsl.Types.IVec;
 			case VBool:
@@ -57,10 +57,10 @@ class Macros {
 	static function makeDef( t : Type, pos : Position ) : haxe.macro.Expr {
 		return switch( t ) {
 		case TFloat, TInt: macro 0;
-		case TVec(_, t):
+		case TVec(n, t):
 			switch( t ) {
 			case VFloat:
-				macro new hxsl.Types.Vec();
+				n == 4 ? macro new hxsl.Types.Vec4() : macro new hxsl.Types.Vec();
 			case VInt:
 				macro new hxsl.Types.IVec();
 			case VBool:
@@ -99,7 +99,7 @@ class Macros {
 					default: throw "assert";
 				};
 			{
-				expr : ENew({ pack : ["h3d"], name : "Vector" }, [for( a in args ) makeInit(a)]),
+				expr : ENew({ pack : ["hxsl"], name : "Types", sub : (g == Vec4 ? "Vec4" : "Vec") }, [for( a in args ) makeInit(a)]),
 				pos : e.p,
 			}
 		default:

+ 1 - 0
hxsl/Types.hx

@@ -1,6 +1,7 @@
 package hxsl;
 
 typedef Vec = h3d.Vector;
+typedef Vec4 = h3d.Vector4;
 typedef IVec = Array<Int>;
 typedef BVec = Array<Bool>;
 typedef Matrix = h3d.Matrix;