Skip to content

Commit

Permalink
Now drag'n'drop assets
Browse files Browse the repository at this point in the history
  • Loading branch information
julien-moreau committed Aug 16, 2018
1 parent 4cfcb83 commit b059da7
Show file tree
Hide file tree
Showing 6 changed files with 85 additions and 4 deletions.
2 changes: 1 addition & 1 deletion preview.html
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@
var effectiveScene = null;
var gotScene = null;

var capturer = new CCapture({ format: 'webm', framerate: 60, verbose: true });
var capturer = new CCapture({ format: 'webm', framerate: 60 });

var tools = null;
var requests = null;
Expand Down
30 changes: 30 additions & 0 deletions src/editor/components/assets.ts
Original file line number Diff line number Diff line change
Expand Up @@ -148,6 +148,18 @@ export default class EditorAssets {
this.editor.core.onSelectAsset.notifyObservers(a.data);
});

// Drag'n'drop
if (c.onDragAndDropAsset) {
const dropListener = this.dragEnd(c, a);
img.addEventListener('dragstart', () => {
this.editor.core.engine.getRenderingCanvas().addEventListener('drop', dropListener);
});

img.addEventListener('dragend', () => {
this.editor.core.engine.getRenderingCanvas().removeEventListener('drop', dropListener);
});
}

// Add
parent.appendChild(img);
parent.appendChild(text);
Expand Down Expand Up @@ -199,6 +211,24 @@ export default class EditorAssets {
this.tabs.select(id);
}

/**
* Returns the drag end event function
* @param component the source component
* @param asset the dropped asset
*/
protected dragEnd (component: IAssetComponent, asset: AssetElement<any>): (ev: DragEvent) => void {
return (ev: DragEvent) => {
const scene = this.editor.core.scene;
const pick = scene.pick(ev.offsetX, ev.offsetY);

if (!pick.pickedMesh)
return;

component.onDragAndDropAsset(pick.pickedMesh, asset);
this.editor.core.onSelectObject.notifyObservers(pick.pickedMesh);
};
}

/**
* Processes the context menu for the clicked item
* @param ev the mouse event object
Expand Down
29 changes: 28 additions & 1 deletion src/extensions/behavior/code.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,9 @@
import { Scene, Node, DirectionalLight, HemisphericLight, Tools as BabylonTools, IParticleSystem, Vector4, Vector3, Vector2, Color4, Color3, Tools, GroundMesh } from 'babylonjs';
import {
Scene, Node, DirectionalLight, HemisphericLight,
Tools as BabylonTools, IParticleSystem, Vector4,
Vector3, Vector2, Color4, Color3, Tools, GroundMesh,
AbstractMesh
} from 'babylonjs';

import Tokenizer, { TokenType } from '../tools/tokenizer';
import { exportScriptString } from '../tools/tools';
Expand Down Expand Up @@ -80,6 +85,28 @@ export default class CodeExtension extends Extension<BehaviorMetadata> implement
return result;
}

/**
* On the user drops an asset
* @param targetMesh the target mesh under the pointer
* @param asset the asset being dropped
*/
public onDragAndDropAsset (targetMesh: AbstractMesh, asset: AssetElement<any>): void {
targetMesh.metadata = targetMesh.metadata || { };

if (!targetMesh.metadata.behavior) {
targetMesh.metadata.behavior = {
node: targetMesh.name,
metadatas: []
};
}

// Add asset
targetMesh.metadata.behavior.metadatas.push({
codeId: asset.data.id,
active: true
});
}

/**
* On the user wants to remove the asset
* @param asset the asset to remove
Expand Down
22 changes: 22 additions & 0 deletions src/extensions/behavior/graph.ts
Original file line number Diff line number Diff line change
Expand Up @@ -114,6 +114,28 @@ export default class GraphExtension extends Extension<BehaviorGraphMetadata> {
this.scene.metadata.behaviorGraphs.push(asset.data);
}

/**
* On the user drops an asset
* @param targetMesh the target mesh under the pointer
* @param asset the asset being dropped
*/
public onDragAndDropAsset (targetMesh: AbstractMesh, asset: AssetElement<any>): void {
targetMesh.metadata = targetMesh.metadata || { };

if (!targetMesh.metadata.behaviorGraph) {
targetMesh.metadata.behaviorGraph = {
node: targetMesh.name,
metadatas: []
};
}

// Add asset
targetMesh.metadata.behaviorGraph.metadatas.push({
graphId: asset.data.id,
active: true
});
}

/**
* On apply the extension
*/
Expand Down
3 changes: 3 additions & 0 deletions src/extensions/typings/asset.ts
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
import { AbstractMesh } from 'babylonjs';

export interface AssetElement<T> {
img?: string;
name?: string;
Expand All @@ -10,4 +12,5 @@ export interface IAssetComponent {
onGetAssets?<T> (): AssetElement<T>[] | Promise<AssetElement<T>[]>;
onRemoveAsset?<T> (asset: AssetElement<T>): void;
onAddAsset?<T> (asset: AssetElement<T>): void;
onDragAndDropAsset?<T> (targetMesh: AbstractMesh, asset: AssetElement<T>): void;
}
3 changes: 1 addition & 2 deletions src/tools/materials/viewer.ts
Original file line number Diff line number Diff line change
Expand Up @@ -245,8 +245,7 @@ export default class AnimationEditor extends EditorPlugin {
});

// Drag'n'drop
let dropListener = this.dragEnd(material);

const dropListener = this.dragEnd(material);
img.addEventListener('dragstart', () => {
this.editor.core.engine.getRenderingCanvas().addEventListener('drop', dropListener);
});
Expand Down

0 comments on commit b059da7

Please sign in to comment.