فهرست منبع

Better mesh spray (#129)

Reset brush when object selected/unselected
Child meshes follow meshSpray object in real time when moving using the gizmo or the editor cursor
We can now undo a paint click when editing with meshSpray
Jed974 4 سال پیش
والد
کامیت
0628a713d5
1فایلهای تغییر یافته به همراه45 افزوده شده و 15 حذف شده
  1. 45 15
      hrt/prefab/l3d/MeshSpray.hx

+ 45 - 15
hrt/prefab/l3d/MeshSpray.hx

@@ -203,6 +203,9 @@ class MeshSpray extends Object3D {
 
 	var sceneEditor : hide.comp.SceneEditor;
 
+	var undo(get, null):hide.ui.UndoHistory;
+	function get_undo() { return sceneEditor.view.undo; }
+
 	var lastIndexMesh = -1;
 	var allSetGroups : Array<SetGroup>;
 	var setGroup : SetGroup;
@@ -308,6 +311,7 @@ class MeshSpray extends Object3D {
 
 	var wasEdited = false;
 	var previewModels : Array<hrt.prefab.Prefab> = [];
+	var sprayedModels : Array<hrt.prefab.Prefab> = [];
 	override function edit( ectx : EditContext ) {
 
 		invParent = getAbsPos().clone();
@@ -325,6 +329,7 @@ class MeshSpray extends Object3D {
 
 		var ctx = ectx.getContext(this);
 		var s2d = @:privateAccess ctx.local2d.getScene();
+		reset();
 		interactive = new h2d.Interactive(10000, 10000, s2d);
 		interactive.propagateEvents = true;
 		interactive.cancelEvents = false;
@@ -365,6 +370,19 @@ class MeshSpray extends Object3D {
 		interactive.onRelease = function(e) {
 			e.propagate = false;
 			sprayEnable = false;
+			var addedModels = sprayedModels.copy();
+			if (sprayedModels.length > 0) {
+				undo.change(Custom(function(undo) {
+					if(undo) {
+						sceneEditor.deleteElements(addedModels, () -> reset(), true, false);
+					}
+					else {
+						sceneEditor.addObject(addedModels, false, true, true);
+					}
+				}));
+				sprayedModels = [];
+			}
+			
 
 			if (previewModels.length > 0) {
 				sceneEditor.deleteElements(previewModels, () -> { }, false);
@@ -679,31 +697,36 @@ class MeshSpray extends Object3D {
 		sceneEditor.properties.element.find("#repeatMeshBtn").prop("checked", CONFIG.dontRepeatMesh);
 	}
 
+	override function removeInstance(ctx : Context):Bool {
+		reset();
+		return super.removeInstance(ctx);
+	}
 	override function setSelected( ctx : Context, b : Bool ) {
-		if (timerCicle != null) {
-			timerCicle.stop();
-		}
 		if( !b ) {
+			reset();
 			if( gBrushes != null ) {
 				for (g in gBrushes) g.remove();
 				gBrushes = null;
 			}
-			if( interactive != null ) interactive.remove();
-			timerCicle = new haxe.Timer(100);
-			timerCicle.run = function() {
-				timerCicle.stop();
-				if (previewModels != null && previewModels.length > 0) {
-					sceneEditor.deleteElements(previewModels, () -> { }, false, false);
-					previewModels = [];
-				}
-				if (wasEdited)
-					sceneEditor.refresh(Partial, () -> { });
-				wasEdited = false;
-			};
 		}
 		return false;
 	}
 
+	function reset() {
+		if( interactive != null ) interactive.remove();
+		if (previewModels != null && previewModels.length > 0) {
+			sceneEditor.deleteElements(previewModels, () -> { }, false, false);
+			previewModels = [];
+		}
+		if (wasEdited)
+			sceneEditor.refresh(Partial, () -> { });
+		wasEdited = false;
+		if( gBrushes != null ) {
+			for (g in gBrushes) g.remove();
+			gBrushes = null;
+		}
+	}
+
 	function addMeshPath(path : String) {
 		var mesh = { path: path, isRef: path.toLowerCase().indexOf(".fbx") == -1 };
 		if (currentMeshes.filter(m -> m.path == path).length == 0)
@@ -841,6 +864,7 @@ class MeshSpray extends Object3D {
 		lastMeshId = -1;
 		if (previewModels.length > 0) {
 			wasEdited = true;
+			sprayedModels = sprayedModels.concat(previewModels);
 			previewModels = [];
 		}
 	}
@@ -921,6 +945,12 @@ class MeshSpray extends Object3D {
 		return ctx;
 	}
 
+	override function applyTransform(o : h3d.scene.Object) {
+		super.applyTransform(o);
+		cast(o, MeshSprayObject).redraw();
+	}
+
+
 	function makePrimCircle(segments: Int, inner : Float = 0, rings : Int = 0) {
 		var points = [];
 		var uvs = [];