فهرست منبع

upgraded prefabs to use @:s serialization + move rfx data from props to prefab classes

Nicolas Cannasse 4 سال پیش
والد
کامیت
31ce4a2f3f
50فایلهای تغییر یافته به همراه511 افزوده شده و 1376 حذف شده
  1. 1 1
      hrt/prefab/Curve.hx
  2. 21 68
      hrt/prefab/Light.hx
  3. 6 18
      hrt/prefab/Model.hx
  4. 5 11
      hrt/prefab/Reference.hx
  5. 3 2
      hrt/prefab/Unknown.hx
  6. 4 21
      hrt/prefab/fx/AnimEvent.hx
  7. 4 7
      hrt/prefab/fx/BaseFX.hx
  8. 2 16
      hrt/prefab/fx/FX2D.hx
  9. 2 16
      hrt/prefab/fx/LookAt.hx
  10. 7 33
      hrt/prefab/l2d/Anim2D.hx
  11. 5 27
      hrt/prefab/l2d/Atlas.hx
  12. 4 23
      hrt/prefab/l2d/Bitmap.hx
  13. 1 12
      hrt/prefab/l2d/Particle2D.hx
  14. 22 78
      hrt/prefab/l2d/Text.hx
  15. 4 21
      hrt/prefab/l3d/Camera.hx
  16. 18 44
      hrt/prefab/l3d/Decal.hx
  17. 10 37
      hrt/prefab/l3d/Environment.hx
  18. 4 21
      hrt/prefab/l3d/GameController.hx
  19. 8 26
      hrt/prefab/l3d/HeightMap.hx
  20. 0 112
      hrt/prefab/l3d/LegacyDecal.hx
  21. 4 18
      hrt/prefab/l3d/Level3D.hx
  22. 1 3
      hrt/prefab/l3d/MeshGenerator.hx
  23. 5 26
      hrt/prefab/l3d/MeshSpray.hx
  24. 1 12
      hrt/prefab/l3d/Particles3D.hx
  25. 8 14
      hrt/prefab/l3d/Polygon.hx
  26. 6 18
      hrt/prefab/l3d/Spline.hx
  27. 5 15
      hrt/prefab/l3d/SplineMesh.hx
  28. 15 39
      hrt/prefab/l3d/Text3D.hx
  29. 1 12
      hrt/prefab/l3d/Trail.hx
  30. 9 36
      hrt/prefab/pbr/Anisotropy.hx
  31. 14 45
      hrt/prefab/pbr/ParticleLit.hx
  32. 7 26
      hrt/prefab/pbr/SpecularColor.hx
  33. 5 24
      hrt/prefab/rfx/AutoExposure.hx
  34. 20 29
      hrt/prefab/rfx/Bloom.hx
  35. 23 38
      hrt/prefab/rfx/CloudShadow.hx
  36. 9 23
      hrt/prefab/rfx/ColorGrading.hx
  37. 2 15
      hrt/prefab/rfx/Configurator.hx
  38. 33 46
      hrt/prefab/rfx/DistanceBlur.hx
  39. 6 12
      hrt/prefab/rfx/Distortion.hx
  40. 21 21
      hrt/prefab/rfx/FrustumJitter.hx
  41. 56 71
      hrt/prefab/rfx/GenFog.hx
  42. 10 0
      hrt/prefab/rfx/RendererFX.hx
  43. 30 42
      hrt/prefab/rfx/Sao.hx
  44. 4 15
      hrt/prefab/rfx/Sharpen.hx
  45. 24 32
      hrt/prefab/rfx/TemporalBloom.hx
  46. 16 33
      hrt/prefab/rfx/TemporalFiltering.hx
  47. 9 23
      hrt/prefab/rfx/Vignetting.hx
  48. 24 63
      hrt/prefab/vlm/LightProbe.hx
  49. 11 30
      hrt/prefab/vlm/VolumetricLightmap.hx
  50. 1 1
      hrt/shader/PbrShader.hx

+ 1 - 1
hrt/prefab/Curve.hx

@@ -10,7 +10,7 @@ class CurveHandle {
 	}
 }
 
-@:enum abstract CurveKeyMode(Int) {
+enum abstract CurveKeyMode(Int) {
 	var Aligned = 0;
 	var Free = 1;
 	var Linear = 2;

+ 21 - 68
hrt/prefab/Light.hx

@@ -1,13 +1,9 @@
 package hrt.prefab;
 
-@:enum abstract LightKind(String) {
-	var Point = "Point";
-	var Directional = "Directional";
-	var Spot = "Spot";
-
-	inline function new(v) {
-		this = v;
-	}
+enum abstract LightKind(String) {
+	var Point;
+	var Directional;
+	var Spot;
 }
 
 typedef LightShadows = {
@@ -40,33 +36,33 @@ typedef ShadowSamplingPCF = {> ShadowSamplingMode,
 
 class Light extends Object3D {
 
-	public var kind : LightKind = Point;
-	public var color : Int = 0xffffff;
-	public var power : Float = 1.0;
+	@:s public var kind : LightKind = Point;
+	@:s public var color : Int = 0xffffff;
+	@:s public var power : Float = 1.0;
+	@:s public var occlusionFactor = 0.0;
+	@:s public var isMainLight : Bool = false;
 	public var shadows : LightShadows = getShadowsDefault();
-	public var occlusionFactor = 0.0;
-	public var isMainLight : Bool = false;
 
 	// Point/Spot
-	public var range : Float = 10;
+	@:s public var range : Float;
 
 	// Point
-	public var size : Float = 1.0;
-	public var zNear : Float = 0.02;
+	@:s public var size : Float = 1.0;
+	@:s public var zNear : Float;
 
 	// Spot
-	public var angle : Float = 90;
-	public var fallOff : Float = 80;
+	@:s public var angle : Float = 90;
+	@:s public var fallOff : Float = 80;
+	@:s public var cookiePath : String = null;
 	public var cookieTex : h3d.mat.Texture = null;
-	public var cookiePath : String = null;
 
 	// Dir
-	public var maxDist : Float = -1;
-	public var minDist : Float = -1;
-	public var autoShrink : Bool = true;
+	@:s public var maxDist : Float = -1;
+	@:s public var minDist : Float = -1;
+	@:s public var autoShrink : Bool = true;
 
 	// Debug
-	public var debugDisplay : Bool = true;
+	@:s public var debugDisplay : Bool = true;
 
 	static function getShadowsDefault() : LightShadows {
 		return {
@@ -84,26 +80,12 @@ class Light extends Object3D {
 	public function new(?parent) {
 		super(parent);
 		type = "light";
+		range = 10;
+		zNear = 0.02;
 	}
 
 	override function save() {
 		var obj : Dynamic = super.save();
-		obj.kind = kind;
-		obj.color = color;
-		obj.range = range;
-		obj.size = size;
-		obj.zNear = zNear;
-		obj.power = power;
-		obj.isMainLight = isMainLight;
-		obj.angle = angle;
-		obj.fallOff = fallOff;
-		obj.cookiePath = cookiePath;
-		obj.occlusionFactor = occlusionFactor;
-		obj.maxDist = maxDist;
-		obj.minDist = minDist;
-		obj.autoShrink = autoShrink;
-		obj.debugDisplay = debugDisplay;
-
 		if( shadows.mode != None ) {
 			obj.shadows = Reflect.copy(shadows);
 			obj.shadows.mode = shadows.mode.getName();
@@ -113,39 +95,10 @@ class Light extends Object3D {
 
 	override function load( obj : Dynamic ) {
 		super.load(obj);
-		kind = obj.kind;
-		color = obj.color;
-		range = obj.range;
-		size = obj.size;
-		zNear = obj.zNear == null ?  0.02 : obj.zNear;
-		power = obj.power;
-		isMainLight = obj.isMainLight;
-		angle = obj.angle;
-		fallOff = obj.fallOff;
-		cookiePath = obj.cookiePath;
-		occlusionFactor = obj.occlusionFactor == null ? 0.0 : obj.occlusionFactor;
-		if( obj.maxDist != null ) maxDist = obj.maxDist;
-		if( obj.minDist != null ) minDist = obj.minDist;
-		if( obj.autoShrink != null ) autoShrink = obj.autoShrink;
-		if( obj.debugDisplay != null ) debugDisplay = obj.debugDisplay;
-
 		if( obj.shadows != null ) {
 			var sh : Dynamic = Reflect.copy(obj.shadows);
 			sh.mode = h3d.pass.Shadows.RenderMode.createByName(sh.mode);
 			shadows = sh;
-
-			// Retro compatibility
-			if( shadows.samplingMode == null ) {
-				if( obj.shadows.power != null ) {
-					shadows.samplingMode = cast {
-						kind : ESM,
-						power : obj.shadows.power,
-						};
-				}
-				else
-					shadows.samplingMode = { kind : None };
-			}
-
 		} else
 			shadows = getShadowsDefault();
 	}

+ 6 - 18
hrt/prefab/Model.hx

@@ -2,10 +2,10 @@ package hrt.prefab;
 
 class Model extends Object3D {
 
-	public var animation : Null<String>;
-	var lockAnimation : Bool = false;
-	var retargetAnim : Bool = false;
-	var retargetIgnore : String = null;
+	@:s public var animation : Null<String>;
+	@:s var lockAnimation : Bool = false;
+	@:s var retargetAnim : Bool = false;
+	@:s var retargetIgnore : String;
 
 	public function new(?parent) {
 		super(parent);
@@ -13,20 +13,8 @@ class Model extends Object3D {
 	}
 
 	override function save() {
-		var obj : Dynamic = super.save();
-		if( animation != null ) obj.animation = animation;
-		if( lockAnimation ) obj.lockAnimation = lockAnimation;
-		if( retargetAnim ) obj.retargetAnim = retargetAnim;
-		if( retargetIgnore != null && retargetIgnore != "" ) obj.retargetIgnore = retargetIgnore;
-		return obj;
-	}
-
-	override function load( obj : Dynamic ) {
-		super.load(obj);
-		animation = obj.animation;
-		lockAnimation = obj.lockAnimation;
-		retargetAnim = obj.retargetAnim;
-		retargetIgnore = obj.retargetIgnore;
+		if( retargetIgnore == "" ) retargetIgnore = null;
+		return super.save();
 	}
 
 	override function makeInstance(ctx:Context):Context {

+ 5 - 11
hrt/prefab/Reference.hx

@@ -2,9 +2,9 @@ package hrt.prefab;
 
 class Reference extends Object3D {
 
-	public var refpath : String;
-	var ref: Prefab = null;
-	var editMode : Bool = false;
+	@:s public var refpath : String;
+	@:s var editMode : Bool = false;
+	public var ref: Prefab = null;
 
 	public function new(?parent) {
 		super(parent);
@@ -19,8 +19,8 @@ class Reference extends Object3D {
 	override function save() {
 		var obj : Dynamic = super.save();
 		// Recalc abs path if ref has been resolved to supprot renaming
-		obj.refpath = ref != null && !isFile() ? ref.getAbsPath() : refpath;
-		obj.editMode = editMode;
+		if( ref != null && !isFile() )
+			obj.refpath = ref.getAbsPath();
 		#if editor
 		if( editMode && isFile() && ref != null )
 			hide.Ide.inst.savePrefab(refpath.substr(1), ref);
@@ -28,12 +28,6 @@ class Reference extends Object3D {
 		return obj;
 	}
 
-	override function load( o : Dynamic ) {
-		super.load(o);
-		refpath = o.refpath;
-		editMode = o.editMode;
-	}
-
 	public function resolveRef(shared : hrt.prefab.ContextShared) {
 		if(ref != null)
 			return ref;

+ 3 - 2
hrt/prefab/Unknown.hx

@@ -9,11 +9,12 @@ class Unknown extends Prefab {
 	}
 
 	override function load(v:Dynamic) {
-		this.data = v;
+		this.data = Reflect.copy(v);
+		Reflect.deleteField(this.data, "children");
 	}
 
 	override function save() {
-		return data;
+		return Reflect.copy(data);
 	}
 
 	#if editor

+ 4 - 21
hrt/prefab/fx/AnimEvent.hx

@@ -2,33 +2,16 @@ package hrt.prefab.fx;
 
 class AnimEvent extends hrt.prefab.fx.Event {
 
-	public var animation: String;
-	public var speed : Float = 1.0;
-	public var duration : Float = 0.0;
-	public var offset : Float = 0.0;
+	@:s public var animation: String;
+	@:s public var speed : Float = 1.0;
+	@:s public var duration : Float = 0.0;
+	@:s public var offset : Float = 0.0;
 
 	public function new(?parent) {
 		super(parent);
 		this.type = "animEvent";
 	}
 
-	override function save() {
-		var obj : Dynamic = super.save();
-		obj.animation = animation;
-		if(speed != 1.0) obj.speed = speed;
-		if(duration > 0) obj.duration = duration;
-		if(offset > 0) obj.offset = offset;
-		return obj;
-	}
-
-	override function load(obj:Dynamic) {
-		super.load(obj);
-		this.animation = obj.animation;
-		if(obj.speed != null) speed = obj.speed;
-		if(obj.duration != null) duration = obj.duration;
-		if(obj.offset != null) offset = obj.offset;
-	}
-
 	override function prepare(ctx: Context) : Event.EventInstance {
 		var obj = ctx.local3d;
 		var anim = animation != null ? ctx.loadAnimation(animation) : null;

+ 4 - 7
hrt/prefab/fx/BaseFX.hx

@@ -58,7 +58,7 @@ typedef ObjectAnimation = {
 
 class BaseFX extends hrt.prefab.Library {
 
-	public var duration : Float;
+	@:s public var duration : Float;
 	public var scriptCode : String;
 	public var cullingRadius : Float;
 	public var markers : Array<{t: Float}> = [];
@@ -72,17 +72,14 @@ class BaseFX extends hrt.prefab.Library {
 
 	override function save() {
 		var obj : Dynamic = super.save();
-		obj.duration = duration;
-		if(markers != null && markers.length > 0)
-			obj.markers = markers.copy();
+		if( markers != null && markers.length > 0 )
+			obj.markers = markers;
 		return obj;
 	}
 
 	override function load( obj : Dynamic ) {
 		super.load(obj);
-		duration = obj.duration == null ? 5.0 : obj.duration;
-		if(obj.markers != null)
-			markers = obj.markers;
+		markers = obj.markers == null ? [] : obj.markers;
 	}
 
 	public static function makeShaderParams(ctx: Context, shaderElt: hrt.prefab.Shader) {

+ 2 - 16
hrt/prefab/fx/FX2D.hx

@@ -146,28 +146,14 @@ class FX2DAnimation extends h2d.Object {
 
 class FX2D extends BaseFX {
 
-	var loop : Bool = false;
-	var startLoop : Float = 0.0;
+	@:s var loop : Bool = false;
+	@:s var startLoop : Float = 0.0;
 
 	public function new() {
 		super();
 		type = "fx2d";
 	}
 
-	override function save() {
-		var obj : Dynamic = super.save();
-		obj.type = type;
-		obj.loop = loop;
-		obj.startLoop = startLoop;
-		return obj;
-	}
-
-	override function load( obj : Dynamic ) {
-		super.load(obj);
-		loop = obj.loop;
-		startLoop = obj.startLoop;
-	}
-
 	function getObjAnimations(ctx:Context, elt: PrefabElement, anims: Array<ObjectAnimation>) {
 		for(c in elt.children) {
 			getObjAnimations(ctx, c, anims);

+ 2 - 16
hrt/prefab/fx/LookAt.hx

@@ -92,28 +92,14 @@ class LookAtObject extends h3d.scene.Object {
 @:allow(hrt.prefab.fx.LookAt.LookAtInstance)
 class LookAt extends Object3D {
 
-	var target(default,null) : String;
-	var lockAxis: Array<Float> = [0,0,0];
+	@:s var target(default,null) : String;
+	@:s var lockAxis: Array<Float> = [0,0,0];
 
 	public function new(?parent) {
 		super(parent);
 		type = "lookAt";
 	}
 
-	override public function load(v:Dynamic) {
-		super.load(v);
-		target = v.target;
-		if(v.lockAxis != null)
-			lockAxis = v.lockAxis;
-	}
-
-	override function save() {
-		var obj : Dynamic = super.save();
-		obj.target = target;
-		obj.lockAxis = lockAxis;
-		return obj;
-	}
-
 	override function updateInstance(ctx:hrt.prefab.Context, ?propName:String) {
 		super.updateInstance(ctx, propName);
 		var targetObj = null;

+ 7 - 33
hrt/prefab/l2d/Anim2D.hx

@@ -3,42 +3,16 @@ package hrt.prefab.l2d;
 class Anim2D extends Object2D {
 
 	// parameters
-	var src : String;
-
-	var widthFrame : Int = 10;
-	var heightFrame : Int = 10;
-	var fpsAnimation : Int = 30;
-	var nbFrames : Int = 30;
-
-	var delayStart : Float = 0;
-
-	var loop : Bool = false;
+	@:s var src : String;
+	@:s var widthFrame : Int = 10;
+	@:s var heightFrame : Int = 10;
+	@:s var fpsAnimation : Int = 30;
+	@:s var nbFrames : Int = 30;
+	@:s var delayStart : Float = 0;
+	@:s var loop : Bool = false;
 
 	var tex : h3d.mat.Texture;
 
-	override public function load(v:Dynamic) {
-		super.load(v);
-		this.src = v.src;
-		this.widthFrame = v.widthFrame;
-		this.heightFrame = v.heightFrame;
-		this.fpsAnimation = v.fpsAnimation;
-		this.nbFrames = v.nbFrames;
-		this.delayStart = v.delayStart;
-		this.loop = v.loop;
-	}
-
-	override function save() {
-		var o : Dynamic = super.save();
-		o.src = src;
-		o.widthFrame = widthFrame;
-		o.heightFrame = heightFrame;
-		o.fpsAnimation = fpsAnimation;
-		o.nbFrames = nbFrames;
-		o.delayStart = delayStart;
-		o.loop = loop;
-		return o;
-	}
-
 	override function updateInstance( ctx: Context, ?propName : String ) {
 		super.updateInstance(ctx, propName);
 

+ 5 - 27
hrt/prefab/l2d/Atlas.hx

@@ -3,36 +3,14 @@ package hrt.prefab.l2d;
 class Atlas extends Object2D {
 
 	// parameters
-	var src : String;
-
-	var fpsAnimation : Int = 30;
-	var delayStart : Float = 0;
-
-	var loop : Bool = false;
-
-	var forcePivotCenter : Bool = false;
+	@:s var src : String;
+	@:s var fpsAnimation : Int = 30;
+	@:s var delayStart : Float = 0;
+	@:s var loop : Bool = false;
+	@:s var forcePivotCenter : Bool = false;
 
 	var atlas : hxd.res.Atlas;
 
-	override public function load(v:Dynamic) {
-		super.load(v);
-		this.src = v.src;
-		this.fpsAnimation = v.fpsAnimation;
-		this.delayStart = v.delayStart;
-		this.loop = v.loop;
-		this.forcePivotCenter = v.forcePivotCenter;
-	}
-
-	override function save() {
-		var o : Dynamic = super.save();
-		o.src = src;
-		o.fpsAnimation = fpsAnimation;
-		o.delayStart = delayStart;
-		o.loop = loop;
-		o.forcePivotCenter = forcePivotCenter;
-		return o;
-	}
-
 	override function updateInstance( ctx: Context, ?propName : String ) {
 		super.updateInstance(ctx, propName);
 

+ 4 - 23
hrt/prefab/l2d/Bitmap.hx

@@ -3,32 +3,13 @@ package hrt.prefab.l2d;
 class Bitmap extends Object2D {
 
 	// parameters
-	var color : Int = 0xFFFFFF;
-
-	var src : String;
-
-	var dx : Float = 0;
-	var dy : Float = 0;
+	@:s var color : Int = 0xFFFFFF;
+	@:s var src : String;
+	@:s var dx : Float = 0;
+	@:s var dy : Float = 0;
 
 	var tex : h3d.mat.Texture;
 
-	override public function load(v:Dynamic) {
-		super.load(v);
-		this.color = v.color;
-		this.src = v.src;
-		this.dx = v.dx;
-		this.dy = v.dy;
-	}
-
-	override function save() {
-		var o : Dynamic = super.save();
-		o.color = color;
-		o.src = src;
-		o.dx = dx;
-		o.dy = dy;
-		return o;
-	}
-
 	override function updateInstance( ctx: Context, ?propName : String ) {
 		super.updateInstance(ctx, propName);
 		var bmp = (cast ctx.local2d : h2d.Bitmap);

+ 1 - 12
hrt/prefab/l2d/Particle2D.hx

@@ -84,18 +84,7 @@ class Particles extends h2d.Particles {
 
 class Particle2D extends Object2D {
 
-	var paramsParticleGroup : Dynamic;
-
-	override public function load(v:Dynamic) {
-		super.load(v);
-		paramsParticleGroup = v.paramsParticleGroup;
-	}
-
-	override function save() {
-		var o : Dynamic = super.save();
-		o.paramsParticleGroup = paramsParticleGroup;
-		return o;
-	}
+	@:s var paramsParticleGroup : Dynamic;
 
 	override function updateInstance( ctx: Context, ?propName : String ) {
 		super.updateInstance(ctx, propName);

+ 22 - 78
hrt/prefab/l2d/Text.hx

@@ -3,96 +3,40 @@ package hrt.prefab.l2d;
 class Text extends Object2D {
 
 	// parameters
-	var color : Int = 0xFFFFFF;
-	var size : Int = 12;
-	var cutoff : Float = 0.5;
-	var smoothing : Float = 1 / 32;
-	var align : Int = 0;
+	@:s var color : Int = 0xFFFFFF;
+	@:s var size : Int = 12;
+	@:s var cutoff : Float = 0.5;
+	@:s var smoothing : Float = 1 / 32;
+	@:s var align : Int = 0;
 
-	var pathFont : String;
+	@:s var pathFont : String;
 
 	// TextShadow
-	var enableTextShadow : Bool = false;
-	var tsDx: Float = 0;
-	var tsDy: Float = 0;
-	var tsColor: Int;
-	var tsAlpha: Float = 1;
+	@:s var enableTextShadow : Bool = false;
+	@:s var tsDx: Float = 0;
+	@:s var tsDy: Float = 0;
+	@:s var tsColor: Int;
+	@:s var tsAlpha: Float = 1;
 
 	// DropShadow
-	var enableDropShadow : Bool = false;
-	var dsDistance: Float = 0;
-	var dsAngle: Float = 0;
-	var dsColor: Int;
-	var dsAlpha: Float = 1;
-	var dsRadius: Float = 0;
-	var dsGain: Float = 1;
-	var dsQuality: Float = 1;
-	var dsSmoothColor: Bool = true;
+	@:s var enableDropShadow : Bool = false;
+	@:s var dsDistance: Float = 0;
+	@:s var dsAngle: Float = 0;
+	@:s var dsColor: Int;
+	@:s var dsAlpha: Float = 1;
+	@:s var dsRadius: Float = 0;
+	@:s var dsGain: Float = 1;
+	@:s var dsQuality: Float = 1;
+	@:s var dsSmoothColor: Bool = true;
 
 	#if editor
-	var text : String = "";
+	@:s var text : String = "";
 	#end
 
 	override public function load(v:Dynamic) {
 		super.load(v);
-		if (v.blendMode == null)
+		if( v.blendMode == null )
 			blendMode = Alpha;
-		this.color = v.color;
-		this.size = v.size;
-		this.cutoff = v.cutoff;
-		this.smoothing = v.smoothing;
-		this.pathFont = v.pathFont;
-		this.align = v.align;
-
-		if (v.enableTextShadow != null) this.enableTextShadow = v.enableTextShadow;
-		if (v.tsDx != null) this.tsDx = v.tsDx;
-		if (v.tsDy != null) this.tsDy = v.tsDy;
-		if (v.tsColor != null) this.tsColor = v.tsColor;
-		if (v.tsAlpha != null) this.tsAlpha = v.tsAlpha;
-
-		if (v.enableDropShadow != null) this.enableDropShadow = v.enableDropShadow;
-		if (v.dsDistance != null) this.dsDistance = v.dsDistance;
-		if (v.dsAngle != null)	this.dsAngle = v.dsAngle;
-		if (v.dsColor != null) this.dsColor = v.dsColor;
-		if (v.dsAlpha != null) this.dsAlpha = v.dsAlpha;
-		if (v.dsRadius != null) this.dsRadius = v.dsRadius;
-		if (v.dsGain != null) this.dsGain = v.dsGain;
-		if (v.dsQuality != null) this.dsQuality = v.dsQuality;
-		if (v.dsSmoothColor != null) this.dsSmoothColor = v.dsSmoothColor;
-
-		#if editor
-		this.text = v.text;
-		#end
-	}
-
-	override function save() {
-		var o : Dynamic = super.save();
-		o.color = color;
-		o.size = size;
-		o.cutoff = cutoff;
-		o.smoothing = smoothing;
-		o.pathFont = pathFont;
-		o.align = align;
-		o.dsDistance = dsDistance;
-
-		o.enableTextShadow = enableTextShadow;
-		o.tsDx = tsDx;
-		o.tsDy = tsDy;
-		o.tsColor = tsColor;
-		o.tsAlpha = tsAlpha;
-
-		o.enableDropShadow = enableDropShadow;
-		o.dsAngle = dsAngle;
-		o.dsColor = dsColor;
-		o.dsAlpha = dsAlpha;
-		o.dsRadius = dsRadius;
-		o.dsGain = dsGain;
-		o.dsQuality = dsQuality;
-		o.dsSmoothColor = dsSmoothColor;
-		#if editor
-		o.text = text;
-		#end
-		return o;
 	}
 
 	override function updateInstance( ctx: Context, ?propName : String ) {

+ 4 - 21
hrt/prefab/l3d/Camera.hx

@@ -28,10 +28,10 @@ class CameraSyncObject extends h3d.scene.Object {
 
 class Camera extends Object3D {
 
-	var fovY : Float = 45;
-	var zFar : Float = 200;
-	var zNear : Float = 0.02;
-	var showFrustum = true;
+	@:s var fovY : Float = 45;
+	@:s var zFar : Float = 200;
+	@:s var zNear : Float = 0.02;
+	@:s var showFrustum = true;
 	var preview = false;
 
 	public function new(?parent) {
@@ -39,23 +39,6 @@ class Camera extends Object3D {
 		type = "camera";
 	}
 
-	override function save() {
-		var obj : Dynamic = super.save();
-		obj.fovY = fovY;
-		obj.zFar = zFar;
-		obj.zNear = zNear;
-		obj.showFrustum = showFrustum;
-		return obj;
-	}
-
-	override function load(obj:Dynamic) {
-		super.load(obj);
-		if(obj.fovY != null) this.fovY = obj.fovY;
-		if(obj.zFar != null) this.zFar = obj.zFar;
-		if(obj.zNear != null) this.zNear = obj.zNear;
-		if(obj.showFrustum != null) this.showFrustum = obj.showFrustum;
-	}
-
 	var g : h3d.scene.Graphics;
 	function drawFrustum( ctx : Context ) {
 

+ 18 - 44
hrt/prefab/l3d/Decal.hx

@@ -1,64 +1,38 @@
 package hrt.prefab.l3d;
 
-@:enum abstract DecalMode(String) {
-	var Default = "Decal";
-	var BeforeTonemapping = "BeforeTonemapping";
-	var AfterTonemapping = "AfterTonemapping";
-	var Terrain = "Terrain";
+enum abstract DecalMode(String) {
+	var Default;
+	var BeforeTonemapping;
+	var AfterTonemapping;
+	var Terrain;
 }
 
 class Decal extends Object3D {
 
-	var albedoMap : String;
-	var normalMap : String;
-	var pbrMap : String;
-	var albedoStrength : Float = 1.0;
-	var normalStrength: Float = 1.0;
-	var pbrStrength: Float = 1.0;
-	var fadePower : Float = 1.0;
-	var fadeStart : Float = 0;
-	var fadeEnd : Float = 1.0;
-	var emissive : Float = 0.0;
+	@:s var albedoMap : String;
+	@:s var normalMap : String;
+	@:s var pbrMap : String;
+	@:s var albedoStrength : Float = 1.0;
+	@:s var normalStrength: Float = 1.0;
+	@:s var pbrStrength: Float = 1.0;
+	@:s var fadePower : Float = 1.0;
+	@:s var fadeStart : Float = 0;
+	@:s var fadeEnd : Float = 1.0;
+	@:s var emissive : Float = 0.0;
+	@:s var renderMode : DecalMode = Default;
+	@:s var centered : Bool = true;
+	@:s var autoAlpha : Bool = true;
 	var blendMode : h2d.BlendMode = Alpha;
-	var renderMode : DecalMode = Default;
-	var centered : Bool = true;
-	var autoAlpha : Bool = true;
 
 	override function save() {
 		var obj : Dynamic = super.save();
-		if(albedoMap != null) obj.albedoMap = albedoMap;
-		if(normalMap != null) obj.normalMap = normalMap;
-		if(pbrMap != null) obj.pbrMap = pbrMap;
-		if(albedoStrength != 1) obj.albedoStrength = albedoStrength;
-		if(normalStrength != 1) obj.normalStrength = normalStrength;
-		if(pbrStrength != 1) obj.pbrStrength = pbrStrength;
 		if(blendMode != Alpha) obj.blendMode = blendMode.getIndex();
-		if(centered != true) obj.centered = centered;
-		if(fadePower != 1) obj.fadePower = fadePower;
-		if(fadeStart != 0) obj.fadeStart = fadeStart;
-		if(fadeEnd != 1) obj.fadeEnd = fadeEnd;
-		if(renderMode != Default) obj.renderMode = renderMode;
-		if(emissive != 0.0) obj.emissive = emissive;
-		if(autoAlpha != true) obj.autoAlpha = autoAlpha;
 		return obj;
 	}
 
 	override function load( obj : Dynamic ) {
 		super.load(obj);
-		albedoMap = obj.albedoMap;
-		normalMap = obj.normalMap;
-		pbrMap = obj.pbrMap;
-		albedoStrength = obj.albedoStrength != null ? obj.albedoStrength : 1;
-		normalStrength = obj.normalStrength != null ? obj.normalStrength : 1;
-		pbrStrength = obj.pbrStrength != null ? obj.pbrStrength : 1;
 		blendMode = obj.blendMode != null ? h2d.BlendMode.createByIndex(obj.blendMode) : Alpha;
-		centered = obj.centered != null ? obj.centered : true;
-		fadePower = obj.fadePower != null ? obj.fadePower : 1;
-		fadeStart = obj.fadeStart != null ? obj.fadeStart : 0;
-		fadeEnd = obj.fadeEnd != null ? obj.fadeEnd : 1;
-		renderMode = obj.renderMode != null ? obj.renderMode : Default;
-		emissive = obj.emissive != null ? obj.emissive : 0.0;
-		if( obj.autoAlpha != null ) autoAlpha = obj.autoAlpha;
 	}
 
 	override function makeInstance(ctx:Context) : Context {

+ 10 - 37
hrt/prefab/l3d/Environment.hx

@@ -4,50 +4,23 @@ package hrt.prefab.l3d;
 @:access(h3d.scene.pbr.Environment)
 class Environment extends Object3D {
 
-	var sourceMapPath : String;
-	var configName : String;
+	@:s public var power : Float = 1.0;
+	@:s public var hdrMax : Float = 10.0;
+	@:s public var rotation : Float = 0.0;
+	@:s public var sampleBits : Int = 12;
+	@:s public var diffSize : Int = 64;
+	@:s public var specSize : Int = 512;
+	@:s public var ignoredSpecLevels : Int = 1;
+
+	@:s var sourceMapPath : String;
+	@:s var configName : String;
 	var env : h3d.scene.pbr.Environment;
 
-	public var power : Float = 1.0;
-	public var hdrMax : Float = 10.0;
-	public var rotation : Float = 0.0;
-	public var sampleBits : Int = 12;
-	public var diffSize : Int = 64;
-	public var specSize : Int = 512;
-	public var ignoredSpecLevels : Int = 1;
-
 	public function new( ?parent ) {
 		super(parent);
 		type = "environment";
 	}
 
-	override function load( obj : Dynamic ) {
-		super.load(obj);
-	 	power = obj.power != null ? obj.power : 1.0;
-		hdrMax = obj.hdrMax != null ? obj.hdrMax : 10.0;
-		rotation = obj.rotation != null ? obj.rotation : 0.0;
-		sampleBits = obj.sampleBits != null ? obj.sampleBits : 12;
-		diffSize = obj.diffSize != null ? obj.diffSize : 64;
-		specSize = obj.specSize != null ? obj.specSize : 512;
-		ignoredSpecLevels = obj.ignoredSpecLevels != null ? obj.ignoredSpecLevels : 1;
-		sourceMapPath = obj.sourceMapPath != null ? obj.sourceMapPath : null;
-		configName = obj.configName;
-	}
-
-	override function save() {
-		var obj : Dynamic = super.save();
-		obj.power = power;
-		obj.rotation = rotation;
-		obj.sampleBits = sampleBits;
-		obj.diffSize = diffSize;
-		obj.specSize = specSize;
-		obj.ignoredSpecLevels = ignoredSpecLevels;
-		obj.sourceMapPath = sourceMapPath;
-		obj.hdrMax = hdrMax;
-		if( configName != null ) obj.configName = configName;
-		return obj;
-	}
-
 	function loadFromBinary() {
 		try {
 			env.dispose();

+ 4 - 21
hrt/prefab/l3d/GameController.hx

@@ -2,27 +2,10 @@ package hrt.prefab.l3d;
 
 class GameController extends Object3D {
 
-	public var moveSpeed : Float = 1.;
-	public var followGround : Bool = true;
-	public var cameraFollowGround : Bool = true;
-	public var startFullScreen : Bool = true;
-
-	override function load(obj:Dynamic) {
-		super.load(obj);
-		moveSpeed = obj.moveSpeed;
-		followGround = obj.followGround;
-		cameraFollowGround = obj.cameraFollowGround;
-		startFullScreen = obj.startFullScreen;
-	}
-
-	override function save():{} {
-		var obj : Dynamic = super.save();
-		obj.moveSpeed = moveSpeed;
-		obj.followGround = followGround;
-		obj.cameraFollowGround = cameraFollowGround;
-		obj.startFullScreen = startFullScreen;
-		return obj;
-	}
+	@:s public var moveSpeed : Float = 1.;
+	@:s public var followGround : Bool = true;
+	@:s public var cameraFollowGround : Bool = true;
+	@:s public var startFullScreen : Bool = true;
 
 	#if editor
 

+ 8 - 26
hrt/prefab/l3d/HeightMap.hx

@@ -362,14 +362,14 @@ class HeightMap extends Object3D {
 
 	var tilesCache : Map<Int,HeightMapTile> = new Map();
 	var textures : Array<{ path : String, kind : HeightMapTextureKind, enable : Bool }> = [];
-	var size = 128.;
-	var heightScale = 0.2;
-	var normalScale = 1.;
-	var heightPrecision = 1.;
-	var minZ = -10;
-	var maxZ = 30;
-	public var quality = 4;
-	var objects : {
+	@:s var size = 128.;
+	@:s var heightScale = 0.2;
+	@:s var normalScale = 1.;
+	@:s var heightPrecision = 1.;
+	@:s var minZ = -10;
+	@:s var maxZ = 30;
+	@:s public var quality = 4;
+	@:s var objects : {
 		var file : String;
 		var assetsPath : String;
 		var scale : Float;
@@ -386,30 +386,12 @@ class HeightMap extends Object3D {
 	override function save():{} {
 		var o : Dynamic = super.save();
 		o.textures = [for( t in textures ) { path : t.path, kind : t.kind }];
-		o.size = size;
-		o.heightScale = heightScale;
-		o.normalScale = normalScale;
-		if( heightPrecision != 1 )
-			o.heightPrecision = heightPrecision;
-		o.quality = quality;
-		o.minZ = minZ;
-		o.maxZ = maxZ;
-		if( objects != null )
-			o.objects = objects;
 		return o;
 	}
 
 	override function load(obj:Dynamic) {
 		super.load(obj);
 		textures = [for( o in (obj.textures:Array<Dynamic>) ) { path : o.path, kind : o.kind, enable : true }];
-		size = obj.size;
-		heightScale = obj.heightScale;
-		normalScale = obj.normalScale;
-		if( obj.heightPrecision != null ) heightPrecision = obj.heightPrecision;
-		if( obj.minZ != null ) minZ = obj.minZ;
-		if( obj.maxZ != null ) maxZ = obj.maxZ;
-		if( obj.quality != null ) quality = obj.quality;
-		objects = obj.objects;
 	}
 
 	public function getZ( x : Float, y : Float ) : Null<Float> {

+ 0 - 112
hrt/prefab/l3d/LegacyDecal.hx

@@ -1,112 +0,0 @@
-package hrt.prefab.l3d;
-
-class LegacyDecal extends Object3D {
-
-	var diffuseMap : String;
-	var normalMap : String;
-	var specularMap : String;
-	var diffuseStrength : Float = 1.;
-	var normalStrength : Float = 1.;
-	var specularStrength : Float = 1.;
-
-	override function save() {
-		var obj : Dynamic = super.save();
-		if(diffuseMap != null) obj.diffuseMap = diffuseMap;
-		if(normalMap != null) obj.normalMap = normalMap;
-		if(specularMap != null) obj.specularMap = specularMap;
-		if(diffuseStrength != 1) obj.diffuseStrength = diffuseStrength;
-		if(normalStrength != 1) obj.normalStrength = normalStrength;
-		if(specularStrength != 1) obj.specularStrength = specularStrength;
-		return obj;
-	}
-
-	override function load( obj : Dynamic ) {
-		super.load(obj);
-		diffuseMap = obj.diffuseMap;
-		normalMap = obj.normalMap;
-		specularMap = obj.specularMap;
-		diffuseStrength = obj.diffuseStrength != null ? obj.diffuseStrength : 1;
-		normalStrength = obj.normalStrength != null ? obj.normalStrength : 1;
-		specularStrength = obj.specularStrength != null ? obj.specularStrength : 1;
-	}
-
-	override function updateInstance(ctx:Context,?propName:String) {
-		super.updateInstance(ctx,propName);
-
-		var mesh = Std.downcast(ctx.local3d, h3d.scene.Mesh);
-		mesh.material.texture = diffuseMap != null ? ctx.loadTexture(diffuseMap) : null;
-		mesh.material.normalMap = normalMap != null ? ctx.loadTexture(normalMap) : null;
-		mesh.material.specularTexture = specularMap != null ? ctx.loadTexture(specularMap) : null;
-		var sh = mesh.material.mainPass.getShader(h3d.shader.pbr.StrengthValues);
-		if( sh != null ) {
-			sh.albedoStrength = diffuseStrength;
-			sh.normalStrength = normalStrength;
-			sh.pbrStrength = specularStrength;
-		}
-	}
-
-	override function makeInstance(ctx:Context):Context {
-		ctx = ctx.clone(this);
-
-		var mesh = new h3d.scene.Mesh(h3d.prim.Cube.defaultUnitCube(), ctx.local3d);
-		mesh.material.setDefaultProps("decal");
-		mesh.material.name = "decal";
-
-		ctx.local3d = mesh;
-		ctx.local3d.name = name;
-		updateInstance(ctx);
-		return ctx;
-	}
-
-
-	#if editor
-	override function getHideProps() : HideProps {
-		return { icon : "paint-brush", name : "Legacy Decal" };
-	}
-
-	override function setSelected( ctx : Context, b : Bool ) {
-		if( b ) {
-			var obj = ctx.shared.contexts.get(this).local3d;
-			var wire = new h3d.scene.Box(0xFFFFFFFF,obj);
-			wire.name = "_highlight";
-			wire.material.setDefaultProps("ui");
-			wire.ignoreCollide = true;
-			wire.material.shadows = false;
-		} else {
-			for( o in ctx.shared.getObjects(this,h3d.scene.Box) )
-				if( o.name == "_highlight" ) {
-					o.remove();
-					return false;
-				}
-		}
-		return true;
-	}
-
-	override function edit( ctx : EditContext ) {
-		super.edit(ctx);
-		var props = ctx.properties.add(new hide.Element('
-			<div class="group" name="Decal">
-				<dl>
-					<dt>Diffuse</dt><dd>
-						<input type="texturepath" field="diffuseMap"/>
-						<br/><input type="range" field="diffuseStrength"/>
-					</dd>
-					<dt>Normal</dt><dd>
-						<input type="texturepath" field="normalMap"/>
-						<br/><input type="range" field="normalStrength"/>
-					</dd>
-					<dt>Specular</dt><dd>
-						<input type="texturepath" field="specularMap"/>
-						<br/><input type="range" field="specularStrength"/>
-					</dd>
-				</dl>
-			</div>
-		'),this, function(pname) {
-			ctx.onChange(this, pname);
-		});
-	}
-	#end
-
-	static var _ = Library.register("decal", LegacyDecal);
-
-}

+ 4 - 18
hrt/prefab/l3d/Level3D.hx

@@ -2,28 +2,14 @@ package hrt.prefab.l3d;
 
 class Level3D extends hrt.prefab.Library {
 
-	public var width : Int = 100;
-	public var height : Int = 100;
-	public var gridSize : Int = 1;
+	@:s public var width : Int;
+	@:s public var height : Int;
+	@:s public var gridSize : Int = 1;
 
 	public function new() {
 		super();
 		type = "level3d";
-	}
-
-	override function save() {
-		var obj : Dynamic = super.save();
-		obj.width = width;
-		obj.height = height;
-		obj.gridSize = gridSize;
-		return obj;
-	}
-
-	override function load( obj : Dynamic ) {
-		super.load(obj);
-		width = obj.width == null ? 100 : obj.width;
-		height = obj.height == null ? 100 : obj.height;
-		gridSize = obj.gridSize == null ? 1 : obj.gridSize;
+		width = height = 100;
 	}
 
 	#if editor

+ 1 - 3
hrt/prefab/l3d/MeshGenerator.hx

@@ -121,12 +121,11 @@ class MeshGenerator extends Object3D {
 	#end
 
 	public var maxDepth = 1;
-	public var shadows = true;
+	@:s public var shadows = true;
 
 	override function save() {
 		var obj : Dynamic = super.save();
 		obj.root = root.save();
-		obj.shadows = shadows;
 		return obj;
 	}
 
@@ -134,7 +133,6 @@ class MeshGenerator extends Object3D {
 		super.load(obj);
 		root = new MeshPart();
 		root.load(obj.root);
-		shadows = obj.shadows == null ? true : obj.shadows;
 	}
 
 	override function makeInstance( ctx : Context ) : Context {

+ 5 - 26
hrt/prefab/l3d/MeshSpray.hx

@@ -177,16 +177,14 @@ class MeshSprayObject extends h3d.scene.Object {
 
 class MeshSpray extends Object3D {
 
-	var meshes : Array<Mesh> = []; // specific set for this mesh spray
-	var defaultConfig: MeshSprayConfig;
+	@:s var meshes : Array<Mesh> = []; // specific set for this mesh spray
+	@:s var defaultConfig: MeshSprayConfig;
+	@:s var currentPresetName : String = null;
+	@:s var currentSetName : String = null;
 
 	var sceneEditor : hide.comp.SceneEditor;
 
 	var lastIndexMesh = -1;
-
-	var currentPresetName : String = null;
-	var currentSetName : String = null;
-
 	var allSetGroups : Array<SetGroup>;
 	var setGroup : SetGroup;
 	var currentSet : Set;
@@ -222,17 +220,10 @@ class MeshSpray extends Object3D {
 	}
 
 	override function save() {
-
 		// prevent saving preview
 		if( previewModels.length > 0 )
 			sceneEditor.deleteElements(previewModels, () -> { }, false);
-
-		var obj : Dynamic = super.save();
-		obj.meshes = meshes;
-		obj.currentPresetName = currentPresetName;
-		obj.currentSetName = currentSetName;
-		obj.defaultConfig = defaultConfig;
-		return obj;
+		return super.save();
 	}
 
 	function getDefaultConfig() : MeshSprayConfig {
@@ -251,18 +242,6 @@ class MeshSpray extends Object3D {
 		};
 	}
 
-	override function load( obj : Dynamic ) {
-		super.load(obj);
-		if (obj.meshes != null)
-			meshes = obj.meshes;
-		if (obj.defaultConfig != null)
-			defaultConfig = obj.defaultConfig;
-		if (obj.currentPresetName != null)
-			currentPresetName = obj.currentPresetName;
-		if (obj.currentSetName != null)
-			currentSetName = obj.currentSetName;
-	}
-
 	override function getHideProps() : HideProps {
 		return { icon : "paint-brush", name : "MeshSpray", hideChildren : p -> return Std.is(p, Model) };
 	}

+ 1 - 12
hrt/prefab/l3d/Particles3D.hx

@@ -2,24 +2,13 @@ package hrt.prefab.l3d;
 
 class Particules3D extends Object3D {
 
-	var data : Any;
+	@:s var data : Any;
 
 	public function new(?parent) {
 		super(parent);
 		type = "particules3D";
 	}
 
-	override function save():{} {
-		var obj : Dynamic = super.save();
-		obj.data = data;
-		return obj;
-	}
-
-	override function load( obj : Dynamic ) {
-		super.load(obj);
-		data = obj.data;
-	}
-
 	override function createObject(ctx:Context) {
 		var parts = new h3d.parts.GpuParticles(ctx.local3d);
 		if( data != null )

+ 8 - 14
hrt/prefab/l3d/Polygon.hx

@@ -15,7 +15,7 @@ class Polygon extends Object3D {
 
 	public var shape(default, null) : Shape = Quad(0);
 	public var points : h2d.col.Polygon;
-	public var color : Int = 0xFFFFFFFF;
+	@:s public var color : Int = 0xFFFFFFFF;
 	#if editor
 	public var editor : hide.prefab.PolygonEditor;
 	public var cachedPrim : h3d.prim.Polygon;
@@ -29,19 +29,15 @@ class Polygon extends Object3D {
 
 	override function save() {
 		var obj : Dynamic = super.save();
+		obj.kind = shape.getIndex();
 		switch(shape){
-			case Quad(subdivision):
-				obj.kind = shape.getIndex();
-				obj.args = shape.getParameters();
-			case Disc(segments, angle, inner, rings):
-				obj.kind = shape.getIndex();
-				obj.args = shape.getParameters();
-			case Custom:
-				obj.kind = 2;
-				obj.points = [for( p in points ) { x : p.x, y : p.y }];
+		case Quad(subdivision):
+			obj.args = shape.getParameters();
+		case Disc(segments, angle, inner, rings):
+			obj.args = shape.getParameters();
+		case Custom:
+			obj.points = [for( p in points ) { x : p.x, y : p.y }];
 		}
-		if( color != -1 )
-			obj.color = color;
 		return obj;
 	}
 
@@ -54,8 +50,6 @@ class Polygon extends Object3D {
 				var list : Array<Dynamic> = obj.points;
 				points = [for(pt in list) new h2d.col.Point(pt.x, pt.y)];
 		}
-		color = obj.color != null ? obj.color : -1;
-
 	}
 
 	override function updateInstance( ctx : Context, ?propName : String) {

+ 6 - 18
hrt/prefab/l3d/Spline.hx

@@ -66,18 +66,18 @@ class Spline extends Object3D {
 	public var shape : CurveShape = Quadratic;
 
 	var data : SplineData;
-	var step : Float = 1.0;
-	var threshold : Float = 0.01;
+	@:s var step : Float = 1.0;
+	@:s var threshold : Float = 0.01;
 
 	// Save/Load the curve as an array of absPos
 	public var pointsData : Array<h3d.Matrix> = [];
 
 	// Graphic
-	public var showSpline : Bool = true;
+	@:s public var showSpline : Bool = true;
 	public var lineGraphics : h3d.scene.Graphics;
-	public var lineThickness : Int = 4;
-	public var color : Int = 0xFFFFFFFF;
-	public var loop : Bool = false;
+	@:s public var lineThickness : Int = 4;
+	@:s public var color : Int = 0xFFFFFFFF;
+	@:s public var loop : Bool = false;
 
 	#if editor
 	public var editor : hide.prefab.SplineEditor;
@@ -119,12 +119,6 @@ class Spline extends Object3D {
 							} ];
 		}
 		obj.shape = shape.getIndex();
-		obj.color = color;
-		obj.lineThickness = lineThickness;
-		obj.loop = loop;
-		obj.showSpline = showSpline;
-		obj.step = step;
-		obj.threshold = threshold;
 		return obj;
 	}
 
@@ -140,12 +134,6 @@ class Spline extends Object3D {
 			}
 		}
 		shape = obj.shape == null ? Linear : CurveShape.createByIndex(obj.shape);
-		color = obj.color != null ? obj.color : 0xFFFFFFFF;
-		lineThickness = obj.lineThickness == null ? 4 : obj.lineThickness;
-		loop = obj.loop == null ? false : obj.loop;
-		showSpline = obj.showSpline == null ? true : obj.showSpline;
-		step = obj.step == null ? 1.0 : obj.step;
-		threshold = obj.threshold == null ? 0.01 : obj.threshold;
 	}
 
 	// Generate the splineData from a matrix, can't move the spline after that

+ 5 - 15
hrt/prefab/l3d/SplineMesh.hx

@@ -104,13 +104,13 @@ class SplineMeshBatch extends h3d.scene.MeshBatch {
 
 class SplineMesh extends Spline {
 
-	var meshPath : String;
+	@:s var meshPath : String;
 	var meshes : Array<h3d.scene.Mesh> = [];
 
-	var splineUVx : Bool = false;
-	var splineUVy : Bool = false;
+	@:s var splineUVx : Bool = false;
+	@:s var splineUVy : Bool = false;
 
-	var spacing: Float = 0.0;
+	@:s var spacing: Float = 0.0;
 	var meshScale = new h3d.Vector(1,1,1);
 	var meshRotation = new h3d.Vector(0,0,0);
 	var modelMat = new h3d.Matrix();
@@ -118,29 +118,19 @@ class SplineMesh extends Spline {
 	var meshBatch : SplineMeshBatch = null;
 	var meshPrimitive : h3d.prim.MeshPrimitive = null;
 	var meshMaterial : h3d.mat.Material = null;
-	var customPass : String;
+	@:s var customPass : String;
 
 	override function save() {
 		var obj : Dynamic = super.save();
-		obj.meshPath = meshPath;
-		obj.spacing = spacing;
 		obj.meshScale = meshScale;
 		obj.meshRotation = meshRotation;
-		obj.splineUVx = splineUVx;
-		obj.splineUVy = splineUVy;
-		obj.customPass = customPass;
 		return obj;
 	}
 
 	override function load( obj : Dynamic ) {
 		super.load(obj);
-		meshPath = obj.meshPath;
-		spacing = obj.spacing == null ? 0.0 : obj.spacing;
 		meshScale = obj.meshScale == null ? new h3d.Vector(1,1,1) : new h3d.Vector(obj.meshScale.x, obj.meshScale.y, obj.meshScale.z);
 		meshRotation = obj.meshRotation == null ? new h3d.Vector(0,0,0) : new h3d.Vector(obj.meshRotation.x, obj.meshRotation.y, obj.meshRotation.z);
-		splineUVx = obj.splineUVx == null ? false : obj.splineUVx;
-		splineUVy = obj.splineUVy == null ? false : obj.splineUVy;
-		customPass = obj.customPass;
 	}
 
 	override function make(ctx: Context) {

+ 15 - 39
hrt/prefab/l3d/Text3D.hx

@@ -50,7 +50,7 @@ class Text3DPrimitive extends h2d.TileGroup.TileLayerContent {
 			if( y > yMax ) yMax = y;
 		}
 	}
-	
+
 	override public function render( engine : h3d.Engine ) {
 		if( tmp == null || tmp.length == 0) return;
 		super.render(engine);
@@ -79,7 +79,7 @@ class SignedDistanceField3D extends hxsl.Shader {
 			return max(min(r, g), min(max(r, g), b));
 		}
 
-		function fragment() {		
+		function fragment() {
 			pixelColor = vec4(color.r, color.g, color.b, smoothstep(alphaCutoff - smoothing, alphaCutoff + smoothing, median(pixelColor.r, pixelColor.g, pixelColor.b)));
 		}
 	}
@@ -88,56 +88,32 @@ class SignedDistanceField3D extends hxsl.Shader {
 
 class Text3D extends Object3D {
 
-	var color : Int = 16777215;
-	var size : Int = 12;
-	var cutoff : Float = 0.5;
-	var smoothing : Float = 1 / 32;
-	var letterSpacing : Float = 0;
-	var align : Int = 0;
-	
-	var pathFont : String;
+	@:s var color : Int = 0xFFFFFF;
+	@:s var size : Int = 12;
+	@:s var cutoff : Float = 0.5;
+	@:s var smoothing : Float = 1 / 32;
+	@:s var letterSpacing : Float = 0;
+	@:s var align : Int = 0;
+	@:s var pathFont : String;
 
-	public var contentText : String = "Empty string";
+	@:s public var contentText : String = "Empty string";
 
 	public function new( ?parent ) {
 		super(parent);
 		type = "text3d";
 	}
 
-	override function load( obj : Dynamic ) {
-		super.load(obj);
-		this.color = obj.color;
-		this.size = obj.size;
-		this.cutoff = obj.cutoff;
-		this.smoothing = obj.smoothing;
-		this.pathFont = obj.pathFont;
-		this.contentText = obj.contentText;
-		this.align = obj.align;
-	}
-
 	#if editor
 
-	override function save() {
-		var obj : Dynamic = super.save();
-		obj.color = color;
-		obj.size = size;
-		obj.cutoff = cutoff;
-		obj.smoothing = smoothing;
-		obj.pathFont = pathFont;
-		obj.contentText = contentText;
-		obj.align = align;
-		return obj;
-	}
-
 	override function getHideProps() : HideProps {
 		return { icon : "font", name : "Text3D" };
 	}
 
 	override function edit( ctx : EditContext ) {
 		super.edit(ctx);
-		
+
 		var parameters = new hide.Element('<div class="group" name="Parameters"></div>');
-		
+
 		var gr = new hide.Element('<dl></dl>').appendTo(parameters);
 
 		new hide.Element('<dt>Font</dt>').appendTo(gr);
@@ -182,7 +158,7 @@ class Text3D extends Object3D {
 		new hide.Element('<dt>Cutoff</dt><dd><input type="range" min="0" max="1" field="cutoff" /></dd>').appendTo(gr);
 		new hide.Element('<dt>Smoothing</dt><dd><input type="range" min="0" max="1" field="smoothing" /></dd>').appendTo(gr);
 		new hide.Element('<dt>Letter Spacing</dt><dd><input type="range" min="-5" max="5" field="letterSpacing" /></dd>').appendTo(gr);
-		
+
 		ctx.properties.add(parameters, this, function(pname) {
 			ctx.onChange(this, pname);
 		});
@@ -196,7 +172,7 @@ class Text3D extends Object3D {
 	}
 
 	#end
-	
+
 	override function updateInstance( ctx : Context, ?propName : String) {
 		super.updateInstance(ctx, propName);
 		if (pathFont == null || pathFont.length == 0) {
@@ -229,7 +205,7 @@ class Text3D extends Object3D {
 			mesh.material.shadows = false;
 			mesh.material.mainPass.setPassName("overlay");
 			mesh.material.mainPass.depth(false, LessEqual);
-			
+
 			var shader = mesh.material.mainPass.getShader(SignedDistanceField3D);
 			if (shader != null) {
 				mesh.material.mainPass.removeShader(shader);

+ 1 - 12
hrt/prefab/l3d/Trail.hx

@@ -2,24 +2,13 @@ package hrt.prefab.l3d;
 
 class Trail extends Object3D {
 
-	var data : Dynamic;
+	@:s var data : Dynamic;
 
 	function new(?parent) {
 		super(parent);
 		data = new h3d.scene.Trail().save();
 	}
 
-	override function load(obj:Dynamic) {
-		super.load(obj);
-		data = obj.data;
-	}
-
-	override function save() : {} {
-		var obj : Dynamic = super.save();
-		obj.data = data;
-		return obj;
-	}
-
 	public function create( ?parent : h3d.scene.Object ) {
 		var tr = new h3d.scene.Trail(parent);
 		tr.load(data);

+ 9 - 36
hrt/prefab/pbr/Anisotropy.hx

@@ -11,51 +11,24 @@ enum abstract AnisotropyMode(String) {
 
 class Anisotropy extends Prefab {
 
-	public var mode : AnisotropyMode = Flat;
+	@:s public var mode : AnisotropyMode = Flat;
 
-	public var intensity : Float = 0.0;
-	public var direction : Float = 0.0;
+	@:s public var intensity : Float = 0.0;
+	@:s public var direction : Float = 0.0;
 
-	public var noiseFrequency : Float = 0.0;
-	public var noiseIntensity : Float = 1.0;
+	@:s public var noiseFrequency : Float = 0.0;
+	@:s public var noiseIntensity : Float = 1.0;
 
-	public var intensityFactor = 1.0;
-	public var noiseIntensityPath : String = null;
-	public var noiseDirectionPath : String = null;
-	public var rotationOffset : Float = 0.0;
+	@:s public var intensityFactor = 1.0;
+	@:s public var noiseIntensityPath : String = null;
+	@:s public var noiseDirectionPath : String = null;
+	@:s public var rotationOffset : Float = 0.0;
 
 	public function new(?parent) {
 		super(parent);
 		type = "anisotropy";
 	}
 
-	override function load( obj : Dynamic ) {
-		super.load(obj);
-		if( obj.mode != null ) mode = obj.mode;
-		if( obj.intensity != null ) intensity = obj.intensity;
-		if( obj.direction != null ) direction = obj.direction;
-		if( obj.noiseFrequency != null ) noiseFrequency = obj.noiseFrequency;
-		if( obj.noiseIntensity != null ) noiseIntensity = obj.noiseIntensity;
-		if( obj.intensityFactor != null ) intensityFactor = obj.intensityFactor;
-		if( obj.noiseIntensityPath != null ) noiseIntensityPath = obj.noiseIntensityPath;
-		if( obj.noiseDirectionPath != null ) noiseDirectionPath = obj.noiseDirectionPath;
-		if( obj.rotationOffset != null ) rotationOffset = obj.rotationOffset;
-	}
-
-	override function save() {
-		var obj : Dynamic = super.save();
-		obj.mode = mode;
-		obj.intensity = intensity;
-		obj.direction = direction;
-		obj.noiseFrequency = noiseFrequency;
-		obj.noiseIntensity = noiseIntensity;
-		obj.intensityFactor = intensityFactor;
-		obj.noiseIntensityPath = noiseIntensityPath;
-		obj.noiseDirectionPath = noiseDirectionPath;
-		obj.rotationOffset = rotationOffset;
-		return obj;
-	}
-
 	function getMaterials( ctx : Context ) {
 		if( Std.is(parent, Material) ) {
 			var material : Material = cast parent;

+ 14 - 45
hrt/prefab/pbr/ParticleLit.hx

@@ -42,55 +42,24 @@ class BackLightingMask extends hxsl.Shader implements h3d.scene.MeshBatch.MeshBa
 }
 
 class ParticleLit extends Prefab {
-	
-	public var directLightingIntensity : Float = 1.0;
-	public var indirectLightingIntensity : Float = 1.0;
-	public var vertexShader : Bool = true;
-	public var backLightingIntensity : Float = 0.0;
-	public var backLightingMask : String = null;
-	public var curvature : Float = 0.0;
-
-	public var normalFlipY : Bool;
-	public var normalFlipX : Bool;
-	public var normalMap : String = null;
-	public var normalIntensity : Float = 1.0;
+
+	@:s public var directLightingIntensity : Float = 1.0;
+	@:s public var indirectLightingIntensity : Float = 1.0;
+	@:s public var vertexShader : Bool = true;
+	@:s public var backLightingIntensity : Float = 0.0;
+	@:s public var backLightingMask : String = null;
+	@:s public var curvature : Float = 0.0;
+
+	@:s public var normalFlipY : Bool;
+	@:s public var normalFlipX : Bool;
+	@:s public var normalMap : String = null;
+	@:s public var normalIntensity : Float = 1.0;
 
 	public function new(?parent) {
 		super(parent);
 		type = "particleLit";
 	}
 
-	override function load( obj : Dynamic ) {
-		super.load(obj);
-		if( obj.vertexShader != null ) vertexShader = obj.vertexShader;
-		if( obj.directLightingIntensity != null ) directLightingIntensity = obj.directLightingIntensity;
-		if( obj.indirectLightingIntensity != null ) indirectLightingIntensity = obj.indirectLightingIntensity;
-		if( obj.backLightingIntensity != null ) backLightingIntensity = obj.backLightingIntensity;
-		if( obj.backLightingMask != null ) backLightingMask = obj.backLightingMask;
-		if( obj.curvature != null ) curvature = obj.curvature;
-
-		if( obj.normalMap != null ) normalMap = obj.normalMap;
-		if( obj.normalIntensity != null ) normalIntensity = obj.normalIntensity;
-		if( obj.normalFlipY != null ) normalFlipY = obj.normalFlipY;
-		if( obj.normalFlipX != null ) normalFlipX = obj.normalFlipX;
-	}
-
-	override function save() {
-		var obj : Dynamic = super.save();
-		obj.vertexShader = vertexShader;
-		obj.directLightingIntensity = directLightingIntensity;
-		obj.indirectLightingIntensity = indirectLightingIntensity;
-		obj.backLightingIntensity = backLightingIntensity;
-		obj.backLightingMask = backLightingMask;
-		obj.curvature = curvature;
-
-		obj.normalMap = normalMap;
-		obj.normalIntensity = normalIntensity;
-		obj.normalFlipY = normalFlipY;
-		obj.normalFlipX = normalFlipX;
-		return obj;
-	}
-
 	override function makeInstance( ctx : Context ):Context {
 		ctx = ctx.clone(this);
 		refreshShaders(ctx);
@@ -106,7 +75,7 @@ class ParticleLit extends Prefab {
 		var o = ctx.local3d;
 
 		for( m in o.getMaterials() ) {
-			
+
 			m.mainPass.removeShader(m.mainPass.getShader(ParticleForward));
 			m.mainPass.removeShader(m.mainPass.getShader(CurvedNormal));
 			m.mainPass.removeShader(m.mainPass.getShader(BackLightingMask));
@@ -157,7 +126,7 @@ class ParticleLit extends Prefab {
 
 	#if editor
 	override function getHideProps() : HideProps {
-		return { 	icon : "cube", 
+		return { 	icon : "cube",
 					name : "ParticleLit",
 					allowParent : function(p) return Std.is(p, Emitter)  };
 	}

+ 7 - 26
hrt/prefab/pbr/SpecularColor.hx

@@ -14,41 +14,22 @@ enum abstract SpecularColorMode(String) {
 class SpecularColor extends Prefab {
 
 	// Amount of dielectric specular reflection. Specifies facing (along normal) reflectivity in the most common 0 - 8% range.
-	public var specular : Float = 0.5;
+	@:s public var specular : Float = 0.5;
 
 	// Tints the facing specular reflection using the base color, while glancing reflection remains white.
-	// Normal dielectrics have colorless reflection, so this parameter is not technically physically correct 
+	// Normal dielectrics have colorless reflection, so this parameter is not technically physically correct
 	// and is provided for faking the appearance of materials with complex surface structure.
-	public var specularTint : Float = 0.0;
+	@:s public var specularTint : Float = 0.0;
 
-	public var specularColorPath : String;
-	public var specularColorCustomValue : Int;
-	public var mode : SpecularColorMode = Albedo;
+	@:s public var specularColorPath : String;
+	@:s public var specularColorCustomValue : Int;
+	@:s public var mode : SpecularColorMode = Albedo;
 
 	public function new(?parent) {
 		super(parent);
 		type = "specularColor";
 	}
 
-	override function load( obj : Dynamic ) {
-		super.load(obj);
-		if( obj.specularTint != null ) specularTint = obj.specularTint;
-		if( obj.specular != null ) specular = obj.specular;
-		if( obj.specularColorCustomValue != null ) specularColorCustomValue = obj.specularColorCustomValue;
-		if( obj.mode != null ) mode = obj.mode;
-		if( obj.specularColorPath != null ) specularColorPath = obj.specularColorPath;
-	}
-
-	override function save() {
-		var obj : Dynamic = super.save();
-		obj.specularTint = specularTint;
-		obj.specular = specular;
-		obj.specularColorPath = specularColorPath;
-		obj.specularColorCustomValue = specularColorCustomValue;
-		obj.mode = mode;
-		return obj;
-	}
-
 	function getMaterials( ctx : Context ) {
 		if( Std.is(parent, Material) ) {
 			var material : Material = cast parent;
@@ -121,7 +102,7 @@ class SpecularColor extends Prefab {
 
 	#if editor
 	override function getHideProps() : HideProps {
-		return { 	icon : "cube", 
+		return { 	icon : "cube",
 					name : "SpecularColor",
 					allowParent : function(p) return p.to(Material) != null };
 	}

+ 5 - 24
hrt/prefab/rfx/AutoExposure.hx

@@ -2,30 +2,11 @@ package hrt.prefab.rfx;
 
 class AutoExposure extends RendererFX {
 
-	var lightFront : Float = 0.;
-	var lightBack : Float = 0.;
-	var lightPower : Float = 1.;
-	var transitionSpeed : Float = 1.;
-	var useLightZ : Bool = true;
-
-	override function save() {
-		var o : Dynamic = super.save();
-		o.lightFront = lightFront;
-		o.lightBack = lightBack;
-		o.lightPower = lightPower;
-		o.transitionSpeed = transitionSpeed;
-		o.useLightZ = useLightZ;
-		return o;
-	}
-
-	override function load(o:Dynamic) {
-		super.load(o);
-		lightFront = o.lightFront;
-		lightBack = o.lightBack;
-		lightPower = o.lightPower;
-		transitionSpeed = o.transitionSpeed;
-		useLightZ = o.useLightZ;
-	}
+	@:s var lightFront : Float = 0.;
+	@:s var lightBack : Float = 0.;
+	@:s var lightPower : Float = 1.;
+	@:s var transitionSpeed : Float = 1.;
+	@:s var useLightZ : Bool = true;
 
 	override function begin( r:h3d.scene.Renderer, step:h3d.impl.RendererFX.Step ) {
 		if( step != BeforeTonemapping )

+ 20 - 29
hrt/prefab/rfx/Bloom.hx

@@ -1,15 +1,5 @@
 package hrt.prefab.rfx;
 
-typedef BloomProps = {
-	var size : Float;
-	var threshold : Float;
-	var intensity : Float;
-	var blur : Float;
-	var saturation : Float;
-	var blurQuality : Float;
-	var blurLinear : Float;
-}
-
 class BloomTonemap extends hxsl.Shader {
 	static var SRC = {
 		@param var bloomTexture : Sampler2D;
@@ -27,37 +17,38 @@ class Bloom extends RendererFX {
 	var bloomBlur = new h3d.pass.Blur();
 	var tonemap = new BloomTonemap();
 
-	public function new(?parent) {
+	@:s public var size : Float;
+	@:s public var threshold : Float;
+	@:s public var intensity : Float = 1;
+	@:s public var blur : Float;
+	@:s public var saturation : Float;
+	@:s public var blurQuality : Float = 1;
+	@:s public var blurLinear : Float;
+
+	function new(?parent) {
 		super(parent);
-		props = ({
-			size : 0.5,
-			blur : 3,
-			intensity : 1.,
-			threshold : 0.5,
-			saturation: 0,
-			blurQuality: 1.0,
-			blurLinear : 0.0,
-		} : BloomProps);
+		size = 0.5;
+		blur = 3;
+		threshold = 0.5;
 	}
 
 	override function end( r:h3d.scene.Renderer, step:h3d.impl.RendererFX.Step ) {
 		if( step == BeforeTonemapping ) {
 			r.mark("Bloom");
-			var pb : BloomProps = props;
-			var bloom = r.allocTarget("bloom", false, pb.size, RGBA16F);
+			var bloom = r.allocTarget("bloom", false, size, RGBA16F);
 			var ctx = r.ctx;
 			ctx.engine.pushTarget(bloom);
 			bloomPass.shader.texture = ctx.getGlobal("hdrMap");
-			bloomPass.shader.threshold = pb.threshold;
-			bloomPass.shader.intensity = pb.intensity;
+			bloomPass.shader.threshold = threshold;
+			bloomPass.shader.intensity = intensity;
 			bloomPass.shader.colorMatrix.identity();
-			bloomPass.shader.colorMatrix.colorSaturate(pb.saturation);
+			bloomPass.shader.colorMatrix.colorSaturate(saturation);
 			bloomPass.render();
 			ctx.engine.popTarget();
 
-			bloomBlur.radius = pb.blur;
-			bloomBlur.quality = pb.blurQuality;
-			bloomBlur.linear = pb.blurLinear;
+			bloomBlur.radius = blur;
+			bloomBlur.quality = blurQuality;
+			bloomBlur.linear = blurLinear;
 			bloomBlur.apply(ctx, bloom);
 
 			tonemap.bloomTexture = bloom;
@@ -77,7 +68,7 @@ class Bloom extends RendererFX {
 			<dt>Blur Quality</dt><dd><input type="range" min="0" max="1" field="blurQuality"/></dd>
 			<dt>Blur Linear</dt><dd><input type="range" min="0" max="1" field="blurLinear"/></dd>
 			</dl>
-		'),props);
+		'),this);
 	}
 	#end
 

+ 23 - 38
hrt/prefab/rfx/CloudShadow.hx

@@ -2,21 +2,6 @@ package hrt.prefab.rfx;
 
 import hxd.res.Loader;
 
-typedef CloudShadowProps = {
-	var opacity : Float;
-	var scale : Float;
-	var speed : Float;
-	var angle : Float;
-	var texturePath : String;
-	var ?distort : {
-		var path : String;
-		var scale : Float;
-		var speed : Float;
-		var angle : Float;
-		var amount : Float;
-	};
-}
-
 class DirLightWithClouds extends h3d.shader.pbr.Light {
 
 	static var SRC = {
@@ -58,16 +43,18 @@ class CloudShadow extends RendererFX {
 
 	var dlwc = new DirLightWithClouds();
 
-	public function new(?parent) {
-		super(parent);
-		props = ({
-			opacity : 1,
-			scale : 1,
-			speed : 0,
-			angle : 0,
-			texturePath : null,
-		}:CloudShadowProps);
-	}
+	@:s public var opacity : Float = 1;
+	@:s public var scale : Float = 1;
+	@:s public var speed : Float;
+	@:s public var angle : Float;
+	@:s public var texturePath : String;
+	@:s public var distort : {
+		var path : String;
+		var scale : Float;
+		var speed : Float;
+		var angle : Float;
+		var amount : Float;
+	};
 
 	override function makeInstance( ctx : Context ) : Context {
 		ctx = super.makeInstance(ctx);
@@ -78,7 +65,6 @@ class CloudShadow extends RendererFX {
 	override function end(r:h3d.scene.Renderer, step:h3d.impl.RendererFX.Step) {
 		if( step == Shadows ) {
 			var ctx = r.ctx;
-			var props : CloudShadowProps = props;
 
 			var mainLight : h3d.scene.pbr.DirLight = null;
 			var l = @:privateAccess ctx.lights;
@@ -97,17 +83,17 @@ class CloudShadow extends RendererFX {
 				dlwc.lightColor.load(mainLight._color);
 				dlwc.lightColor.scale3(mainLight.power * mainLight.power);
 				dlwc.occlusionFactor = mainLight.occlusionFactor;
-				var angle = props.angle * Math.PI / 180;
-				var speed = props.speed / props.scale;
+				var angle = angle * Math.PI / 180;
+				var speed = speed / scale;
 				dlwc.speed.set(Math.cos(angle) * speed, Math.sin(angle) * speed);
-				dlwc.scale = 1.0 / props.scale;
-				dlwc.opacity = props.opacity;
+				dlwc.scale = 1.0 / scale;
+				dlwc.opacity = opacity;
 				dlwc.time = ctx.time;
-				if( props.texturePath != null )
-					dlwc.clouds = Loader.currentInstance.load(props.texturePath).toTexture();
+				if( texturePath != null )
+					dlwc.clouds = Loader.currentInstance.load(texturePath).toTexture();
 				if( dlwc.clouds != null )
 					dlwc.clouds.wrap = Repeat;
-				var dist = props.distort;
+				var dist = distort;
 				dlwc.hasDistort = dist != null;
 				if( dist != null ) {
 					var angle = dist.angle * Math.PI / 180;
@@ -131,9 +117,8 @@ class CloudShadow extends RendererFX {
 				<dt>Angle</dt><dd><input type="range" min="-180" max="180" field="angle"/></dd>
 				<dt>Texture</dt><dd><input type="texturepath" field="texturePath"/></dd>
 			</div>
-		'),props);
-		var p : CloudShadowProps = props;
-		var dist = p.distort;
+		'),this);
+		var dist = distort;
 		if( dist == null )
 			dist = {
 				path : null,
@@ -153,9 +138,9 @@ class CloudShadow extends RendererFX {
 		'),dist, function(name) {
 			if( name == "path" ) {
 				if( dist.path == null )
-					p.distort = js.Lib.undefined;
+					distort = js.Lib.undefined;
 				else
-					p.distort = dist;
+					distort = dist;
 			}
 		});
 	}

+ 9 - 23
hrt/prefab/rfx/ColorGrading.hx

@@ -2,12 +2,6 @@ package hrt.prefab.rfx;
 
 import hxd.Pixels;
 
-typedef ColorGradingProps = {
-	var size : Int;
-	var texturePath : String;
-	var intensity : Float;
-}
-
 class ColorGradingTonemap extends hxsl.Shader {
 	static var SRC = {
 
@@ -42,29 +36,22 @@ class ColorGrading extends RendererFX {
 	var tonemap = new ColorGradingTonemap();
 	public var customLut : h3d.mat.Texture;
 
-	public function new(?parent) {
-		super(parent);
-		props = ({
-			size : 16,
-			texturePath : null,
-			intensity : 1.0,
-		} : ColorGradingProps);
-	}
+	@:s var size : Int = 16;
+	@:s var texturePath : String;
+	@:s public var intensity : Float = 1;
 
 	public function getLutTexture() {
-		var p : ColorGradingProps = props;
-		if( p.texturePath == null ) return null;
-		return hxd.res.Loader.currentInstance.load(p.texturePath).toTexture();
+		if( texturePath == null ) return null;
+		return hxd.res.Loader.currentInstance.load(texturePath).toTexture();
 	}
 
 	override function end( r:h3d.scene.Renderer, step:h3d.impl.RendererFX.Step ) {
 		if( step == BeforeTonemapping ) {
 			r.mark("ColorGrading");
-			var p : ColorGradingProps = props;
-			tonemap.intensity = p.intensity;
-			tonemap.size = p.size;
+			tonemap.intensity = intensity;
+			tonemap.size = size;
 			tonemap.lut = customLut != null ? customLut : getLutTexture();
-			if( tonemap.lut != null && p.intensity > 0 )
+			if( tonemap.lut != null && intensity > 0 )
 				r.addShader(tonemap);
 		}
 	}
@@ -92,7 +79,6 @@ class ColorGrading extends RendererFX {
 		but.click(function(_) {
 			function saveTexture( name : String ) {
 				if( name == null ) return;
-				var size = (props:ColorGradingProps).size;
 				var step = hxd.Math.ceil(255/(size - 1));
 				var p = hxd.Pixels.alloc(size * size, size, RGBA);
 				for( r in 0 ... size ) {
@@ -109,7 +95,7 @@ class ColorGrading extends RendererFX {
 			ctx.ide.chooseFileSave("defaultLUT.png", saveTexture);
 		});
 
-		ctx.properties.add(e, props);
+		ctx.properties.add(e, this);
 	}
 	#end
 

+ 2 - 15
hrt/prefab/rfx/Configurator.hx

@@ -65,8 +65,8 @@ class ConfiguratorInterp extends hscript.Interp {
 
 class Configurator extends RendererFX {
 
-	public var vars : Array<{ name : String, defValue : Float }> = [];
-	var script : String = "";
+	@:s public var vars : Array<{ name : String, defValue : Float }> = [];
+	@:s var script : String = "";
 	var values : Map<String, Float> = new Map();
 
 	var prefabCache : Map<String, Prefab> = new Map();
@@ -84,19 +84,6 @@ class Configurator extends RendererFX {
 		type = "configurator";
 	}
 
-	override function save():{} {
-		var obj : Dynamic = super.save();
-		obj.vars = vars;
-		obj.script = script;
-		return obj;
-	}
-
-	override function load(v:Dynamic) {
-		super.load(v);
-		vars = v.vars;
-		script = v.script;
-	}
-
 	public function set( name : String, value : Float ) {
 		values.set(name,value);
 	}

+ 33 - 46
hrt/prefab/rfx/DistanceBlur.hx

@@ -1,6 +1,6 @@
 package hrt.prefab.rfx;
 
-class DistanceBlurShader extends PbrShader {
+class DistanceBlurShader extends hrt.shader.PbrShader {
 
 	static var SRC = {
 
@@ -48,66 +48,53 @@ class DistanceBlurShader extends PbrShader {
 
 }
 
-typedef DistanceBlurProps = {
-
-	var nearStartDistance : Float;
-	var nearEndDistance : Float;
-	var nearStartIntensity : Float;
-	var nearEndIntensity : Float;
-
- 	var farStartDistance : Float;
-	var farEndDistance : Float;
-	var farStartIntensity : Float;
-	var farEndIntensity : Float;
-
-	var showDebug : Bool;
-	var blurTextureSize : Float;
-	var blurRange : Int;
-}
-
 class DistanceBlur extends RendererFX {
 
 	var blurPass = new h3d.pass.ScreenFx(new DistanceBlurShader());
 	var lbrBlur = new h3d.pass.Blur();
 
-	public function new(?parent) {
-		super(parent);
-		props = ({
-			nearStartDistance : 0,
-			nearEndDistance : 10,
-			nearStartIntensity : 1,
-			nearEndIntensity : 0,
-			farStartDistance : 100,
-			farEndDistance : 500,
-			farStartIntensity : 0,
-			farEndIntensity : 1,
-			showDebug : false,
-			blurTextureSize : 0.5,
-			blurRange : 6,
-		} : DistanceBlurProps);
+	@:s public var nearStartDistance : Float;
+	@:s public var nearEndDistance : Float;
+	@:s public var nearStartIntensity : Float = 1;
+	@:s public var nearEndIntensity : Float;
+
+	@:s public var farStartDistance : Float;
+	@:s public var farEndDistance : Float;
+	@:s public var farStartIntensity : Float;
+	@:s public var farEndIntensity : Float = 1;
 
+	@:s public var showDebug : Bool;
+	@:s public var blurTextureSize : Float;
+	@:s public var blurRange : Int;
+
+	function new(?parent) {
+		super(parent);
+		nearEndDistance = 10;
+		farStartDistance = 100;
+		farEndDistance = 500;
+		blurTextureSize = 0.5;
+		blurRange = 6;
 		blurPass.pass.setBlendMode(Alpha);
 	}
 
 	override function end(r:h3d.scene.Renderer, step:h3d.impl.RendererFX.Step) {
 		if( !checkEnabled() ) return;
-		var p : DistanceBlurProps = props;
 		if( step == AfterTonemapping ) {
 			var ctx = r.ctx;
-			blurPass.shader.nearStartDistance = p.nearStartDistance;
-			blurPass.shader.nearEndDistance = p.nearEndDistance;
-			blurPass.shader.nearStartIntensity = p.nearStartIntensity;
-			blurPass.shader.nearEndIntensity = p.nearEndIntensity;
-			blurPass.shader.farStartDistance = p.farStartDistance;
-			blurPass.shader.farEndDistance = p.farEndDistance;
-			blurPass.shader.farStartIntensity = p.farStartIntensity;
-			blurPass.shader.farEndIntensity = p.farEndIntensity;
-			blurPass.shader.DEBUG = #if editor p.showDebug #else false #end;
+			blurPass.shader.nearStartDistance = nearStartDistance;
+			blurPass.shader.nearEndDistance = nearEndDistance;
+			blurPass.shader.nearStartIntensity = nearStartIntensity;
+			blurPass.shader.nearEndIntensity = nearEndIntensity;
+			blurPass.shader.farStartDistance = farStartDistance;
+			blurPass.shader.farEndDistance = farEndDistance;
+			blurPass.shader.farStartIntensity = farStartIntensity;
+			blurPass.shader.farEndIntensity = farEndIntensity;
+			blurPass.shader.DEBUG = #if editor showDebug #else false #end;
 
 			var ldr : h3d.mat.Texture = ctx.getGlobal("ldrMap");
-			var lbrBlurred = r.allocTarget("ldrBlurred", false, p.blurTextureSize, RGBA);
+			var lbrBlurred = r.allocTarget("ldrBlurred", false, blurTextureSize, RGBA);
 			r.copy(ldr, lbrBlurred);
-			lbrBlur.radius = p.blurRange;
+			lbrBlur.radius = blurRange;
 			lbrBlur.apply(ctx, lbrBlurred);
 
 			blurPass.shader.blurredTexture = lbrBlurred;
@@ -138,7 +125,7 @@ class DistanceBlur extends RendererFX {
 				<div class="group" name="Debug">
 					<dt>Show Debug</dt><dd><input type="checkbox" field="showDebug"/></dd>
 				</div>
-		'),props);
+		'),this);
 		super.edit(ctx);
 	}
 	#end

+ 6 - 12
hrt/prefab/rfx/Distortion.hx

@@ -1,16 +1,14 @@
 package hrt.prefab.rfx;
 
-typedef DistortionProps = {
-}
-
 class DistortionTonemap extends hxsl.Shader {
 	static var SRC = {
 
 		var calculatedUV : Vec2;
 		@param var distortionMap : Sampler2D;
+		@param var amount : Float;
 
 		function fragment() {
-			var distortionVal = distortionMap.get(calculatedUV).rg;
+			var distortionVal = distortionMap.get(calculatedUV).rg * amount;
 			calculatedUV += distortionVal;
 		}
 	}
@@ -19,17 +17,11 @@ class DistortionTonemap extends hxsl.Shader {
 class Distortion extends RendererFX {
 
 	var tonemap = new DistortionTonemap();
-
-	public function new(?parent) {
-		super(parent);
-		props = ({
-		} : DistortionProps);
-	}
+	@:s public var amount : Float = 1;
 
 	override function end( r:h3d.scene.Renderer, step:h3d.impl.RendererFX.Step ) {
 		if( step == BeforeTonemapping ) {
 			r.mark("Distortion");
-			var p : DistortionProps = props;
 
 			r.mark("Distortion");
 			var distortionMap = r.allocTarget("distortion", true, 1.0, RG16F);
@@ -38,6 +30,7 @@ class Distortion extends RendererFX {
 			r.clear(0);
 			r.draw("distortion");
 
+			tonemap.amount = amount;
 			tonemap.distortionMap = distortionMap;
 			r.addShader(tonemap);
 		}
@@ -48,9 +41,10 @@ class Distortion extends RendererFX {
 		ctx.properties.add(new hide.Element('
 			<div class="group" name="Distortion">
 				<dl>
+					<dt>Amount</dt><dd><input type="range" min="0" max="1" field="amount"/></dd>
 				</dl>
 			</div>
-		'),props);
+		'),this);
 	}
 	#end
 

+ 21 - 21
hrt/prefab/rfx/FrustumJitter.hx

@@ -1,27 +1,27 @@
 package hrt.prefab.rfx;
 
-@:enum abstract Pattern(String) {
-	var Still = "Still";
-	var Uniform2 = "Uniform2";
-	var Uniform4 = "Uniform4";
-	var Uniform4_Helix = "Uniform4_Helix";
-	var Uniform4_DoubleHelix = "Uniform4_DoubleHelix";
-	var SkewButterfly = "SkewButterfly";
-	var Rotated4 = "Rotated4";
-	var Rotated4_Helix = "Rotated4_Helix";
-	var Rotated4_Helix2 = "Rotated4_Helix2";
-	var Poisson10 = "Poisson10";
-	var Pentagram = "Pentagram";
-	var Halton_2_3_x8 = "Halton_2_3_x8";
-	var Halton_2_3_x16 = "Halton_2_3_x16";
-	var Halton_2_3_x32 = "Halton_2_3_x32";
-	var Halton_2_3_x256 = "Halton_2_3_x256";
-	var MotionPerp2 = "MotionPerp2";
-	var MotionVPerp2 = "MotionVPerp2";
+enum abstract Pattern(String) {
+	var Still;
+	var Uniform2;
+	var Uniform4;
+	var Uniform4_Helix;
+	var Uniform4_DoubleHelix;
+	var SkewButterfly;
+	var Rotated4;
+	var Rotated4_Helix;
+	var Rotated4_Helix2;
+	var Poisson10;
+	var Pentagram;
+	var Halton_2_3_x8;
+	var Halton_2_3_x16;
+	var Halton_2_3_x32;
+	var Halton_2_3_x256;
+	var MotionPerp2;
+	var MotionVPerp2;
 }
 
 class FrustumJitter {
-	
+
 	public var points_Still : Array<Float> = [
 		0.0, 0.0,
 	];
@@ -120,7 +120,7 @@ class FrustumJitter {
 	];
 
 
-	
+
     private inline function getSeq( pattern : Pattern ) : Array<Float> {
        return switch (pattern) {
 			case Still: points_Still;
@@ -182,7 +182,7 @@ class FrustumJitter {
 
         var x = patternScale * pattern[2 * i + 0];
 		var y = patternScale * pattern[2 * i + 1];
-		
+
 		return new h2d.col.Point(x, y);
 
         /*if (pattern != Pattern.MotionPerp2)

+ 56 - 71
hrt/prefab/rfx/GenFog.hx

@@ -1,6 +1,6 @@
 package hrt.prefab.rfx;
 
-class GenFogShader extends PbrShader {
+class GenFogShader extends hrt.shader.PbrShader {
 
 	static var SRC = {
 
@@ -65,93 +65,79 @@ typedef GenFogNoise = {
 	var distAmount : Float;
 }
 
-typedef GenFogProps = {
- 	var startDistance : Float;
-	var endDistance : Float;
-	var distanceOpacity : Float;
-	var distanceFixed : Bool;
+enum abstract GenFogRenderMode(String) {
+	var BeforeTonemapping;
+	var AfterTonemapping;
+}
 
-	var startHeight : Float;
-	var endHeight : Float;
-	var heightOpacity : Float;
+class GenFog extends RendererFX {
 
-	var startOpacity : Float;
-	var endOpacity : Float;
+	var fogPass = new h3d.pass.ScreenFx(new GenFogShader());
 
-	var startColor : Int;
-	var endColor : Int;
-	var renderMode : String;
+	@:s public var startDistance : Float;
+	@:s public var endDistance : Float;
+	@:s public var distanceOpacity : Float;
+	@:s public var distanceFixed : Bool;
 
-	var ?noise : GenFogNoise;
+	@:s public var startHeight : Float;
+	@:s public var endHeight : Float;
+	@:s public var heightOpacity : Float;
 
-	var posX : Float;
-	var posY : Float;
-	var posZ : Float;
-	var usePosition : Bool;
-}
+	@:s public var startOpacity : Float;
+	@:s public var endOpacity : Float;
 
-class GenFog extends RendererFX {
+	@:s public var startColor : Int;
+	@:s public var endColor : Int;
+	@:s public var renderMode : GenFogRenderMode;
 
-	var fogPass = new h3d.pass.ScreenFx(new GenFogShader());
+	@:s public var noise : GenFogNoise;
+
+	@:s public var posX : Float;
+	@:s public var posY : Float;
+	@:s public var posZ : Float;
+	@:s public var usePosition : Bool;
 
 	public function new(?parent) {
 		super(parent);
-		props = ({
-			startDistance : 0,
-			endDistance : 100,
-			distanceOpacity : 0,
-			distanceFixed : false,
-
-			startHeight : 100,
-			endHeight : 0,
-			heightOpacity : 0,
-
-			posX : 0,
-			posY : 0,
-			posZ : 0,
-			usePosition : false,
-
-			startOpacity : 0,
-			endOpacity : 1,
-		 	startColor : 0xffffff,
-	    	endColor : 0xffffff,
-			renderMode : "AfterTonemapping",
-		} : GenFogProps);
-
+		renderMode = AfterTonemapping;
+		endDistance = 100;
+		startHeight = 100;
+		endOpacity = 1;
+		startColor = 0xffffff;
+	    endColor = 0xffffff;
 		fogPass.pass.setBlendMode(Alpha);
 	}
 
 	override function end(r:h3d.scene.Renderer, step:h3d.impl.RendererFX.Step) {
 		if( !checkEnabled() ) return;
-		var p : GenFogProps = props;
-		if( (step == AfterTonemapping && p.renderMode == "AfterTonemapping") || (step == BeforeTonemapping && p.renderMode == "BeforeTonemapping") ) {
+		if( (step == AfterTonemapping && renderMode == AfterTonemapping) || (step == BeforeTonemapping && renderMode == BeforeTonemapping) ) {
 			r.mark("DistanceFog");
 			var ctx = r.ctx;
 
-			fogPass.shader.startDistance = p.startDistance;
-			fogPass.shader.distanceScale = 1 / (p.endDistance - p.startDistance);
-			fogPass.shader.distanceOpacity = p.distanceOpacity;
-			fogPass.shader.cameraDistance = p.distanceFixed ? r.ctx.camera.pos.sub(r.ctx.camera.target).length() : 0;
+			fogPass.shader.startDistance = startDistance;
+			fogPass.shader.distanceScale = 1 / (endDistance - startDistance);
+			fogPass.shader.distanceOpacity = distanceOpacity;
+			fogPass.shader.cameraDistance = distanceFixed ? r.ctx.camera.pos.sub(r.ctx.camera.target).length() : 0;
 
-			fogPass.shader.startHeight = p.startHeight;
-			fogPass.shader.heightScale = 1 / (p.endHeight - p.startHeight);
-			fogPass.shader.heightOpacity = p.heightOpacity;
+			fogPass.shader.startHeight = startHeight;
+			fogPass.shader.heightScale = 1 / (endHeight - startHeight);
+			fogPass.shader.heightOpacity = heightOpacity;
 
-			fogPass.shader.startColor.setColor(p.startColor);
-			fogPass.shader.endColor.setColor(p.endColor);
-			fogPass.shader.startColor.a = p.startOpacity;
-			fogPass.shader.endColor.a = p.endOpacity;
+			fogPass.shader.startColor.setColor(startColor);
+			fogPass.shader.endColor.setColor(endColor);
+			fogPass.shader.startColor.a = startOpacity;
+			fogPass.shader.endColor.a = endOpacity;
 
-			fogPass.shader.position.set(p.posX, p.posY, p.posZ);
-			fogPass.shader.usePosition = p.usePosition;
+			fogPass.shader.position.set(posX, posY, posZ);
+			fogPass.shader.usePosition = usePosition;
 
-			fogPass.shader.useNoise = p.noise != null && p.noise.texture != null;
-			if( p.noise != null && p.noise.texture != null ) {
-				fogPass.shader.noiseTex = hxd.res.Loader.currentInstance.load(p.noise.texture).toTexture();
+			fogPass.shader.useNoise = noise != null && noise.texture != null;
+			if( noise != null && noise.texture != null ) {
+				fogPass.shader.noiseTex = hxd.res.Loader.currentInstance.load(noise.texture).toTexture();
 				fogPass.shader.noiseTex.wrap = Repeat;
-				fogPass.shader.noiseScale = 1 / p.noise.scale;
-				fogPass.shader.noiseSpeed = p.noise.speed / p.noise.scale;
-				fogPass.shader.noiseAmount.set(p.noise.amount * p.noise.distAmount, p.noise.amount * p.noise.distAmount, p.noise.amount);
+				fogPass.shader.noiseScale = 1 / noise.scale;
+				fogPass.shader.noiseSpeed = noise.speed / noise.scale;
+				fogPass.shader.noiseAmount.set(noise.amount * noise.distAmount, noise.amount * noise.distAmount, noise.amount);
 			}
 
 
@@ -196,16 +182,15 @@ class GenFog extends RendererFX {
 				</div>
 
 			</dl>
-		'),props);
-		var props : GenFogProps = props;
-		if( props.noise == null ) {
+		'),this);
+		if( noise == null ) {
 			var e = ctx.properties.add(new hide.Element('
 			<div class="group" name="Noise">
 			<dl><dt></dt><dd><a class="button" href="#">Add</a></dd></dl>
 			</div>
 			'));
 			e.find("a.button").click(function(_) {
-				props.noise = {
+				noise = {
 					texture : null,
 					amount : 1,
 					scale : 1,
@@ -226,9 +211,9 @@ class GenFog extends RendererFX {
 				<dt></dt><dd><a class="button" href="#">Remove</a></dd>
 			</dl>
 			</div>
-			'),props.noise);
+			'),noise);
 			e.find("a.button").click(function(_) {
-				props.noise = null;
+				noise = null;
 				ctx.rebuildProperties();
 			});
 		}

+ 10 - 0
hrt/prefab/rfx/RendererFX.hx

@@ -13,6 +13,16 @@ class RendererFX extends Prefab implements h3d.impl.RendererFX {
 	public function dispose() {
 	}
 
+	override function load(obj:Dynamic) {
+		if( obj.props != null ) {
+			// backward compatibility : copy all props to object
+			for( f in Reflect.fields(obj.props) )
+				Reflect.setField(obj, f, Reflect.field(obj.props,f));
+			Reflect.deleteField(obj,"props");
+		}
+		super.load(obj);
+	}
+
 	inline function checkEnabled() {
 		#if editor
 		return enableInEditor;

+ 30 - 42
hrt/prefab/rfx/Sao.hx

@@ -1,40 +1,29 @@
 package hrt.prefab.rfx;
 
-typedef SaoProps = {
-	var size : Float;
-	var blur : Float;
-	var blurQuality : Float;
-	var noiseScale : Float;
-	var samples : Int;
-	var radius : Float;
-	var intensity : Float;
-	var bias : Float;
-	var microIntensity : Float;
-	var useWorldUV : Bool;
-	var noiseTexturePath: String;
-}
-
 class Sao extends RendererFX {
 
+	@:s public var size : Float = 1;
+	@:s public var blur : Float;
+	@:s public var blurQuality : Float = 1;
+	@:s public var noiseScale : Float = 1;
+	@:s public var samples : Int;
+	@:s public var radius : Float;
+	@:s public var intensity : Float = 1;
+	@:s public var bias : Float;
+	@:s public var microIntensity : Float = 1;
+	@:s public var useWorldUV : Bool;
+	@:s public var noiseTexturePath: String;
+
 	var sao : h3d.pass.ScalableAO;
 	var saoBlur = new h3d.pass.Blur();
 	var saoCopy = new h3d.pass.Copy();
 
-	public function new(?parent) {
+	function new(?parent) {
 		super(parent);
-		props = ({
-			size : 1,
-			blur : 5,
-			blurQuality : 1.0,
-			noiseScale : 1.0,
-			samples : 30,
-			radius : 1,
-			intensity : 1,
-			bias : 0.1,
-			microIntensity : 1.0,
-			useWorldUV : false,
-			noiseTexturePath : null,
-		} : SaoProps);
+		blur = 5;
+		samples = 30;
+		radius = 1;
+		bias = 0.1;
 	}
 
 	function loadNoiseTexture(path : String, ?wrap : h3d.mat.Data.Wrap){
@@ -52,33 +41,32 @@ class Sao extends RendererFX {
 		if( step == Lighting ) {
 			r.mark("SSAO");
 			if( sao == null ) sao = new h3d.pass.ScalableAO();
-			var props : SaoProps = props;
 			var ctx = r.ctx;
-			var saoTex = r.allocTarget("sao",false, props.size);
+			var saoTex = r.allocTarget("sao",false, size);
 			var normal : hxsl.ChannelTexture = ctx.getGlobal("normalMap");
 			var depth : hxsl.ChannelTexture = ctx.getGlobal("depthMap");
 			var occlu : hxsl.ChannelTexture = ctx.getGlobal("occlusionMap");
 			ctx.engine.pushTarget(saoTex);
-			sao.shader.numSamples = props.samples;
-			sao.shader.sampleRadius	= props.radius;
-			sao.shader.intensity = props.intensity - 1;
-			sao.shader.bias = props.bias * props.bias;
+			sao.shader.numSamples = samples;
+			sao.shader.sampleRadius	= radius;
+			sao.shader.intensity = intensity - 1;
+			sao.shader.bias = bias * bias;
 			sao.shader.depthTextureChannel = depth.channel;
 			sao.shader.normalTextureChannel = normal.channel;
-			sao.shader.useWorldUV = props.useWorldUV;
+			sao.shader.useWorldUV = useWorldUV;
 			sao.shader.microOcclusion = occlu.texture;
 			sao.shader.microOcclusionChannel = occlu.channel;
-			sao.shader.microOcclusionIntensity = props.microIntensity;
-			sao.shader.noiseScale.set(props.noiseScale, props.noiseScale);
-			if( props.noiseTexturePath != null )
-				sao.shader.noiseTexture = loadNoiseTexture(props.noiseTexturePath, Repeat);
+			sao.shader.microOcclusionIntensity = microIntensity;
+			sao.shader.noiseScale.set(noiseScale, noiseScale);
+			if( noiseTexturePath != null )
+				sao.shader.noiseTexture = loadNoiseTexture(noiseTexturePath, Repeat);
 			else
 				sao.shader.noiseTexture = h3d.mat.Texture.genNoise(128);
 			sao.apply(depth.texture,normal.texture,ctx.camera);
 			ctx.engine.popTarget();
 
-			saoBlur.radius = props.blur;
-			saoBlur.quality = props.blurQuality;
+			saoBlur.radius = blur;
+			saoBlur.quality = blurQuality;
 			saoBlur.apply(ctx, saoTex);
 
 			saoCopy.pass.setColorChannel(occlu.channel);
@@ -113,7 +101,7 @@ class Sao extends RendererFX {
 			</dl>
 			</dl>
 		</div>
-		'),props);
+		'),this);
 	}
 	#end
 

+ 4 - 15
hrt/prefab/rfx/Sharpen.hx

@@ -1,9 +1,5 @@
 package hrt.prefab.rfx;
 
-typedef SharpenProps = {
-	var intensity : Float;
-}
-
 class SharpenShader extends h3d.shader.ScreenShader {
 	static var SRC = {
 
@@ -30,23 +26,16 @@ class SharpenShader extends h3d.shader.ScreenShader {
 class Sharpen extends RendererFX {
 
 	var sharpenPass = new h3d.pass.ScreenFx(new SharpenShader());
-
-	public function new(?parent) {
-		super(parent);
-		props = ({
-			intensity : 1.,
-		} : SharpenProps);
-	}
+	@:s public var intensity : Float;
 
 	override function end( r:h3d.scene.Renderer, step:h3d.impl.RendererFX.Step ) {
 		if( step == AfterTonemapping ) {
 			r.mark("Sharpen");
-			var pb : SharpenProps = props;
 			var sharpen = r.allocTarget("sharpen", true, 1.0, RGBA);
 			var ctx = r.ctx;
 			ctx.engine.pushTarget(sharpen);
 			sharpenPass.shader.source = ctx.getGlobal("ldrMap");
-			sharpenPass.shader.intensity = pb.intensity;
+			sharpenPass.shader.intensity = intensity;
 			sharpenPass.shader.resolution.set(ctx.engine.width, ctx.engine.height);
 			sharpenPass.render();
 			ctx.engine.popTarget();
@@ -60,10 +49,10 @@ class Sharpen extends RendererFX {
 		ctx.properties.add(new hide.Element('
 			<div class="group" name="Sharpen">
 				<dl>
-					<dt>Intensity</dt><dd><input type="range" min="0" max="10" field="intensity"/></dd>
+					<dt>Intensity</dt><dd><input type="range" min="0" max="1" field="intensity"/></dd>
 				</dl>
 			</div>
-		'),props);
+		'),this);
 	}
 	#end
 

+ 24 - 32
hrt/prefab/rfx/TemporalBloom.hx

@@ -79,18 +79,16 @@ class Threshold extends h3d.shader.ScreenShader {
 	};
 }
 
-typedef TemporalBloomProps = {
-	var size : Float;
-	var downScaleCount : Int;
-	var threshold : Float;
-    var intensity : Float;
-	var maxValue : Float;
-	var useTemporalFilter : Bool;
-	var temporalStrength : Float;
-}
-
 class TemporalBloom extends RendererFX {
 
+	@:s public var size : Float;
+	@:s public var downScaleCount : Int;
+	@:s public var threshold : Float;
+    @:s public var intensity : Float = 1;
+	@:s public var maxValue : Float;
+	@:s public var useTemporalFilter : Bool = true;
+	@:s public var temporalStrength : Float;
+
 	var thresholdPass = new h3d.pass.ScreenFx(new Threshold());
 	var downScale = new h3d.pass.ScreenFx(new DualFilterDown());
 	var upScale = new h3d.pass.ScreenFx(new DualFilterUp());
@@ -100,17 +98,12 @@ class TemporalBloom extends RendererFX {
 
 	var tonemap = new Bloom.BloomTonemap();
 
-	public function new(?parent) {
+	function new(?parent) {
 		super(parent);
-		props = ({
-			size : 0.5,
-			downScaleCount : 5,
-			threshold : 0.5,
-            intensity : 1.0,
-			maxValue : 100.0,
-			useTemporalFilter : true,
-			temporalStrength : 0,
-		} : TemporalBloomProps);
+		size = 0.5;
+		downScaleCount = 5;
+		threshold = 0.5;
+		maxValue = 100.0;
 		prevCamMat = new h3d.Matrix();
 		prevCamMat.identity();
 	}
@@ -118,22 +111,21 @@ class TemporalBloom extends RendererFX {
 	override function end(r:h3d.scene.Renderer, step:h3d.impl.RendererFX.Step) {
 		if( step == BeforeTonemapping ) {
 			r.mark("TBloom");
-			var pb : TemporalBloomProps = props;
 			var ctx = r.ctx;
 
-			var source = r.allocTarget("source", false, pb.size, RGBA16F);
+			var source = r.allocTarget("source", false, size, RGBA16F);
 			ctx.engine.pushTarget(source);
 			thresholdPass.shader.hdr = ctx.getGlobal("hdrMap");
-			thresholdPass.shader.threshold = pb.threshold;
-            thresholdPass.shader.intensity = pb.intensity;
-			thresholdPass.shader.maxIntensity = pb.maxValue;
-			if( pb.useTemporalFilter ) {
+			thresholdPass.shader.threshold = threshold;
+            thresholdPass.shader.intensity = intensity;
+			thresholdPass.shader.maxIntensity = maxValue;
+			if( useTemporalFilter ) {
 				thresholdPass.shader.USE_TEMPORAL_FILTER = true;
-				prevResult = r.allocTarget("pr", false, pb.size, RGBA16F);
+				prevResult = r.allocTarget("pr", false, size, RGBA16F);
 				thresholdPass.shader.prev = prevResult;
 				thresholdPass.shader.prevCamMat.load(prevCamMat);
 				thresholdPass.shader.cameraInverseViewProj.load(ctx.camera.getInverseViewProj());
-				thresholdPass.shader.strength = pb.temporalStrength;
+				thresholdPass.shader.strength = temporalStrength;
 				thresholdPass.render();
 				ctx.engine.popTarget();
 				Copy.run(source, prevResult);
@@ -145,9 +137,9 @@ class TemporalBloom extends RendererFX {
 				ctx.engine.popTarget();
 			}
 
-			var curSize = pb.size;
+			var curSize = size;
 			var curTarget : h3d.mat.Texture = source;
-			for( i in 0 ... pb.downScaleCount ) {
+			for( i in 0 ... downScaleCount ) {
 				curSize *= 0.5;
 				var prevTarget = curTarget;
 				curTarget = r.allocTarget("dso_"+i, false, curSize, RGBA16F);
@@ -157,7 +149,7 @@ class TemporalBloom extends RendererFX {
 				downScale.render();
 				ctx.engine.popTarget();
 			}
-			for( i in 0 ... pb.downScaleCount ) {
+			for( i in 0 ... downScaleCount ) {
 				curSize *= 2.0;
 				var prevTarget = curTarget;
 				curTarget = r.allocTarget("uso_"+i, false, curSize, RGBA16F);
@@ -191,7 +183,7 @@ class TemporalBloom extends RendererFX {
 			<dt>Strength</dt><dd><input type="range" min="0" max="1" field="temporalStrength"/></dd>
 			</dl>
 		</div>
-		'),props);
+		'),this);
 	}
 	#end
 

+ 16 - 33
hrt/prefab/rfx/TemporalFiltering.hx

@@ -1,15 +1,5 @@
 package hrt.prefab.rfx;
 
-typedef TemporalFilteringProps = {
-	var amount : Float;
-	var varianceClipping : Bool;
-	var ycocg : Bool;
-	var unjitter : Bool;
-	var jitterPattern : FrustumJitter.Pattern;
-	var jitterScale : Float;
-	var renderMode : String;
-}
-
 class TemporalFilteringShader extends h3d.shader.ScreenShader {
 
 	static var SRC = {
@@ -123,24 +113,19 @@ class TemporalFilteringShader extends h3d.shader.ScreenShader {
 
 class TemporalFiltering extends hrt.prefab.rfx.RendererFX {
 
+	@:s public var amount : Float;
+	@:s public var varianceClipping : Bool = true;
+	@:s public var ycocg : Bool = true;
+	@:s public var unjitter : Bool = true;
+	@:s public var jitterPattern : FrustumJitter.Pattern = Still;
+	@:s public var jitterScale : Float = 1;
+	@:s public var renderMode : String = "AfterTonemapping";
+
 	public var frustumJitter = new FrustumJitter();
 	public var pass = new h3d.pass.ScreenFx(new TemporalFilteringShader());
 	public var jitterMat = new h3d.Matrix();
 	var curMatNoJitter = new h3d.Matrix();
 
-	public function new(?parent) {
-		super(parent);
-		props = ({
-			amount : 0.0,
-			varianceClipping : true,
-			ycocg : true,
-			unjitter : true,
-			jitterPattern : Still,
-			jitterScale : 1.0,
-			renderMode : "AfterTonemapping",
-		} : TemporalFilteringProps);
-	}
-
 	var tmp = new h3d.Matrix();
 	public function getMatrixJittered( camera : h3d.Camera ) : h3d.Matrix {
 		tmp.identity();
@@ -152,11 +137,10 @@ class TemporalFiltering extends hrt.prefab.rfx.RendererFX {
 	override function begin( r:h3d.scene.Renderer, step:h3d.impl.RendererFX.Step ) {
 		if( step == MainDraw ) {
 			var ctx = r.ctx;
-			var p : TemporalFilteringProps = props;
 			var s = pass.shader;
 
-			frustumJitter.curPattern = p.jitterPattern;
-			frustumJitter.patternScale = p.jitterScale;
+			frustumJitter.curPattern = jitterPattern;
+			frustumJitter.patternScale = jitterScale;
 			frustumJitter.update();
 
 			// Translation Matrix for Jittering
@@ -175,8 +159,7 @@ class TemporalFiltering extends hrt.prefab.rfx.RendererFX {
 
 	override function end( r:h3d.scene.Renderer, step:h3d.impl.RendererFX.Step ) {
 		var ctx = r.ctx;
-		var p : TemporalFilteringProps = props;
-		if( ( step == AfterTonemapping && p.renderMode == "AfterTonemapping") || (step == BeforeTonemapping && p.renderMode == "BeforeTonemapping" ) ) {
+		if( ( step == AfterTonemapping && renderMode == "AfterTonemapping") || (step == BeforeTonemapping && renderMode == "BeforeTonemapping" ) ) {
 			r.mark("TemporalFiltering");
 			var output : h3d.mat.Texture = ctx.engine.getCurrentTarget();
 			var depthMap : Dynamic = ctx.getGlobal("depthMap");
@@ -187,7 +170,7 @@ class TemporalFiltering extends hrt.prefab.rfx.RendererFX {
 			var s = pass.shader;
 			s.curFrame = curFrame;
 			s.prevFrame = prevFrame;
-			s.amount = p.amount;
+			s.amount = amount;
 
 			s.PACKED_DEPTH = depthMap.packed != null && depthMap.packed == true;
 			if( s.PACKED_DEPTH ) {
@@ -199,9 +182,9 @@ class TemporalFiltering extends hrt.prefab.rfx.RendererFX {
 			}
 
 			s.resolution.set(output.width, output.height);
-			s.VARIANCE_CLIPPING = p.varianceClipping;
-			s.YCOCG = p.ycocg;
-			s.UNJITTER = p.unjitter;
+			s.VARIANCE_CLIPPING = varianceClipping;
+			s.YCOCG = ycocg;
+			s.UNJITTER = unjitter;
 
 			r.setTarget(output);
 			pass.render();
@@ -255,7 +238,7 @@ class TemporalFiltering extends hrt.prefab.rfx.RendererFX {
 						</select></dd>
 				</div>
 			</dl>
-		'),props);
+		'),this);
 	}
 	#end
 

+ 9 - 23
hrt/prefab/rfx/Vignetting.hx

@@ -4,13 +4,6 @@ import hrt.prefab.rfx.RendererFX;
 import hrt.prefab.Library;
 import hxd.Math;
 
-typedef VignettingProps = {
-	var color : Int;
-	var alpha : Float;
-	var radius : Float;
-	var softness : Float;
-}
-
 class VignettingShader extends h3d.shader.ScreenShader {
 	static var SRC = {
 
@@ -32,24 +25,17 @@ class Vignetting extends RendererFX {
 
 	var vignettingPass = new h3d.pass.ScreenFx(new VignettingShader());
 
-	public function new(?parent) {
-		super(parent);
-		props = ({
-	    	color : 0xffffff,
-			alpha : 1.0,
-			radius : 1.0,
-			softness : 0.0,
-		} : VignettingProps);
-	}
+	@:s public var color : Int = 0xFFFFFF;
+	@:s public var alpha : Float = 1;
+	@:s public var radius : Float = 1;
+	@:s public var softness : Float;
 
 	function sync( r : h3d.scene.Renderer ) {
 		var ctx = r.ctx;
-		var props : VignettingProps = props;
-		var color = h3d.Vector.fromColor(props.color);
-		color.a = props.alpha;
-		vignettingPass.shader.color.load(color);
-		vignettingPass.shader.radius = props.radius;
-		vignettingPass.shader.softness = props.softness;
+		vignettingPass.shader.color.setColor(color);
+		vignettingPass.shader.color.a = alpha;
+		vignettingPass.shader.radius = radius;
+		vignettingPass.shader.softness = softness;
 		vignettingPass.pass.setBlendMode(Alpha);
 	}
 
@@ -71,7 +57,7 @@ class Vignetting extends RendererFX {
 				<dt>Radius</dt><dd><input type="range" min="0" max="1" field="radius"/></dd>
 				<dt>Softness</dt><dd><input type="range" min="0" max="1" field="softness"/></dd>
 			</dl>
-		'),props);
+		'),this);
 		super.edit(ctx);
 	}
 	#end

+ 24 - 63
hrt/prefab/vlm/LightProbe.hx

@@ -3,15 +3,15 @@ package hrt.prefab.vlm;
 import hrt.prefab.l3d.Level3D;
 import h3d.scene.pbr.Environment;
 
-@:enum abstract ProbeMode(String) {
-	var Texture = "Texture";
-	var Capture = "Capture";
+enum abstract ProbeMode(String) {
+	var Texture;
+	var Capture;
 }
 
-@:enum abstract ProbeFadeMode(String) {
-	var Linear = "Linear";
-	var Smoothstep = "Smoothstep";
-	var Pow2 = "Pow2";
+enum abstract ProbeFadeMode(String) {
+	var Linear;
+	var Smoothstep;
+	var Pow2;
 }
 
 class DebugView extends hxsl.Shader {
@@ -172,31 +172,31 @@ class LightProbeObject extends h3d.scene.Mesh {
 class LightProbe extends Object3D {
 
 	// Probe
-	public var mode : ProbeMode = Texture;
-	public var priority : Int = 0;
+	@:s public var mode : ProbeMode = Texture;
+	@:s public var priority : Int = 0;
 
 	// Fade
-	public var fadeDist : Float = 0.0;
-	public var fadeMode : ProbeFadeMode = Linear;
+	@:s public var fadeDist : Float = 0.0;
+	@:s public var fadeMode : ProbeFadeMode = Linear;
 
 	// Texture Mode
-	public var texturePath : String = null;
-	public var hdrMax : Float = 10.0;
-	public var rotation : Float = 0.0;
+	@:s public var texturePath : String = null;
+	@:s public var hdrMax : Float = 10.0;
+	@:s public var rotation : Float = 0.0;
 
 	// Capture Mode
-	public var bounce : Int = 1;
+	@:s public var bounce : Int = 1;
 
 	// Shared
-	public var power : Float = 1.0;
-	public var sampleBits : Int = 12;
-	public var diffSize : Int = 16;
-	public var specSize : Int = 64;
-	public var ignoredSpecLevels : Int = 2;
+	@:s public var power : Float = 1.0;
+	@:s public var sampleBits : Int = 12;
+	@:s public var diffSize : Int = 16;
+	@:s public var specSize : Int = 64;
+	@:s public var ignoredSpecLevels : Int = 2;
 
 	// Debug
-	public var debugDisplay : Bool = true;
-	public var sphereRadius : Float = 0.5;
+	@:s public var debugDisplay : Bool = true;
+	@:s public var sphereRadius : Float = 0.5;
 
 	public function new( ?parent : Prefab ) {
 		super(parent);
@@ -223,45 +223,6 @@ class LightProbe extends Object3D {
 		name = "lightProbe_" + curIndex;
 	}
 
-	override function load( obj : Dynamic ) {
-		super.load(obj);
-		if( obj.mode != null ) mode = obj.mode;
-		if( obj.bounce != null ) bounce = obj.bounce;
-		if( obj.priority != null ) priority = obj.priority;
-		if( obj.texturePath != null) texturePath = obj.texturePath;
-		if( obj.fadeDist != null ) fadeDist = obj.fadeDist;
-		if( obj.fadeMode != null ) fadeMode = obj.fadeMode;
-		if( obj.power != null ) power = obj.power;
-		if( obj.hdrMax != null ) hdrMax = obj.hdrMax;
-		if( obj.rotation != null ) rotation = obj.rotation;
-		if( obj.sampleBits != null ) sampleBits = obj.sampleBits;
-		if( obj.diffSize != null ) diffSize = obj.diffSize;
-		if( obj.specSize != null ) specSize = obj.specSize;
-		if( obj.ignoredSpecLevels != null ) ignoredSpecLevels = obj.ignoredSpecLevels;
-		if( obj.debugDisplay != null ) debugDisplay = obj.debugDisplay;
-		if( obj.sphereRadius != null ) sphereRadius = obj.sphereRadius;
-	}
-
-	override function save() {
-		var o : Dynamic = super.save();
-		o.mode = mode;
-		o.bounce = bounce;
-		o.priority = priority;
-		o.texturePath = texturePath;
-		o.fadeDist = fadeDist;
-		o.fadeMode = fadeMode;
-		o.power = power;
-		o.hdrMax = hdrMax;
-		o.rotation = rotation;
-		o.sampleBits = sampleBits;
-		o.diffSize = diffSize;
-		o.specSize = specSize;
-		o.ignoredSpecLevels = ignoredSpecLevels;
-		o.debugDisplay = debugDisplay;
-		o.sphereRadius = sphereRadius;
-		return o;
-	}
-
 	override function makeInstance( ctx : Context ) : Context {
 		ctx = ctx.clone(this);
 		var lpo = new LightProbeObject(ctx.local3d);
@@ -368,7 +329,7 @@ class LightProbe extends Object3D {
 				if( propName == "sampleBits" || propName == "ignoredSpecLevels" )
 					needCompute = true;
 
-				if( loadBinary(lpo.env, ctx) ) 
+				if( loadBinary(lpo.env, ctx) )
 					needCompute = false; // No Env available with binary load, everything else is already baked
 
 				if( needCompute )
@@ -484,7 +445,7 @@ class LightProbe extends Object3D {
 				}
 			}
 		];
-		
+
 		var totalBytes = 0;
 		totalBytes += 4 + 4 + 4 + 4; // diffSize + specSize + ignoredSpecLevels + sampleBits
 		for( p in diffusePixels )

+ 11 - 30
hrt/prefab/vlm/VolumetricLightmap.hx

@@ -2,20 +2,20 @@ package hrt.prefab.vlm;
 
 class VolumetricLightmap extends Object3D {
 
-	var voxelsize_x : Float = 1.0;
-	var voxelsize_y : Float = 1.0;
-	var voxelsize_z : Float = 1.0;
-	var strength :  Float = 1.0;
-	var order : Int = 1;
-	var displaySH_field = false;
+	@:s var voxelsize_x : Float = 1.0;
+	@:s var voxelsize_y : Float = 1.0;
+	@:s var voxelsize_z : Float = 1.0;
+	@:s var strength :  Float = 1.0;
+	@:s var order : Int = 1;
 
 	public var volumetricLightmap : VolumetricMesh;
-	var useWorldAlignedProbe = false;
-	var displaySH = false;
-	var resolution : Int = 16;
+	@:s var useWorldAlignedProbe = false;
+	@:s var displaySH = false;
+	@:s var resolution : Int = 16;
 	var useGPU = true;
 
 	#if editor
+	var displaySH_field = false;
 	var maxOrderBaked = 0;
 	var baker : hide.view.l3d.ProbeBakerProcess;
 	#end
@@ -25,31 +25,12 @@ class VolumetricLightmap extends Object3D {
 		type = "volumetricLightmap";
 	}
 
+	#if editor
 	override function load( obj : Dynamic ) {
 		super.load(obj);
-		voxelsize_x =  obj.voxelsize_x == null ? 1 : obj.voxelsize_x;
-		voxelsize_y =  obj.voxelsize_y == null ? 1 : obj.voxelsize_y;
-		voxelsize_z =  obj.voxelsize_z == null ? 1 : obj.voxelsize_z;
-		strength =  obj.strength == null ? 1 : obj.strength;
-		order =  obj.order == null ? 1 : obj.order;
-		displaySH = obj.displaySH == null ? false : obj.displaySH;
 		displaySH_field = displaySH;
-		useWorldAlignedProbe = obj.useWorldAlignedProbe == null ? false : obj.useWorldAlignedProbe;
-		resolution = obj.resolution == null ? 16 : obj.resolution;
-	}
-
-	override function save() {
-		var o : Dynamic = super.save();
-		if( voxelsize_x > 0 ) o.voxelsize_x = voxelsize_x;
-		if( voxelsize_y > 0 ) o.voxelsize_y = voxelsize_y;
-		if( voxelsize_z > 0 ) o.voxelsize_z = voxelsize_z;
-		o.strength = strength;
-		o.order = order;
-		o.displaySH = displaySH;
-		o.useWorldAlignedProbe = useWorldAlignedProbe;
-		o.resolution = resolution;
-		return o;
 	}
+	#end
 
 	function initProbes(){
 		createDebugPreview();

+ 1 - 1
hrt/prefab/rfx/PbrShader.hx → hrt/shader/PbrShader.hx

@@ -1,4 +1,4 @@
-package hrt.prefab.rfx;
+package hrt.shader;
 
 class PbrShader extends h3d.shader.ScreenShader {