summaryrefslogtreecommitdiff
path: root/public/assets/javascripts/rectangles/engine/scenery
diff options
context:
space:
mode:
Diffstat (limited to 'public/assets/javascripts/rectangles/engine/scenery')
-rw-r--r--public/assets/javascripts/rectangles/engine/scenery/_scenery.js55
-rw-r--r--public/assets/javascripts/rectangles/engine/scenery/move.js58
-rw-r--r--public/assets/javascripts/rectangles/engine/scenery/randomize.js115
-rw-r--r--public/assets/javascripts/rectangles/engine/scenery/resize.js109
-rw-r--r--public/assets/javascripts/rectangles/engine/scenery/sound.js16
-rw-r--r--public/assets/javascripts/rectangles/engine/scenery/types/_object.js123
-rw-r--r--public/assets/javascripts/rectangles/engine/scenery/types/audio.js77
-rw-r--r--public/assets/javascripts/rectangles/engine/scenery/types/image.js19
-rw-r--r--public/assets/javascripts/rectangles/engine/scenery/types/text.js58
-rw-r--r--public/assets/javascripts/rectangles/engine/scenery/types/video.js35
-rw-r--r--public/assets/javascripts/rectangles/engine/scenery/undo.js161
11 files changed, 688 insertions, 138 deletions
diff --git a/public/assets/javascripts/rectangles/engine/scenery/_scenery.js b/public/assets/javascripts/rectangles/engine/scenery/_scenery.js
index d34e299..6203c20 100644
--- a/public/assets/javascripts/rectangles/engine/scenery/_scenery.js
+++ b/public/assets/javascripts/rectangles/engine/scenery/_scenery.js
@@ -5,11 +5,13 @@ var Scenery = new function(){
base.list = {}
base.nextMedia = null
+ base.nextWallpaper = null
- base.mouse = new mouse ({ use_offset: false })
+ base.mouse = new mouse ({ use_offset: false, mousedownUsesCapture: true })
base.init = function(){
base.resize.init()
+ base.sound.init()
}
base.add = function(opt){
@@ -22,20 +24,35 @@ var Scenery = new function(){
case 'video':
case 'youtube':
case 'vimeo':
+ if (is_mobile) return
scene_media = new Scenery.types.video (opt)
break
+
+ case 'soundcloud':
+ if (is_mobile) return
+ scene_media = new Scenery.types.audio (opt)
+ break
+
+ case 'text':
+ scene_media = new Scenery.types.text (opt)
+ scene_media.focused = !! opt.newMedia
+ break
}
base.list[scene_media.id] = scene_media
return scene_media
}
base.addNextToWall = function(opt){
+ opt.newMedia = true
opt.media = base.nextMedia
opt.index = opt.index || 0
var scene_media = base.add(opt)
// test if scenery was placed here
- if (! scene_media.bounds) {
+ if (! scene_media) {
+ return null
+ }
+ else if (! scene_media.bounds) {
base.remove( scene_media.id )
return null
}
@@ -48,7 +65,7 @@ var Scenery = new function(){
base.find = function(id){
return base.list[id] || null
}
-
+
base.remove = function(id){
var scene_media = base.list[id]
delete base.list[id]
@@ -83,6 +100,7 @@ var Scenery = new function(){
}
base.deserialize = function(scenery_data){
+ var added = []
scenery_data.forEach(function(data){
var wall = Walls.lookup[data.wall_id] || Walls.first()
var scene_media = base.add({
@@ -91,9 +109,40 @@ var Scenery = new function(){
media: data.media,
id: data.id
})
+ added.push(scene_media)
})
+ return added
}
+ base.rewindAll = function(){
+ base.forEach(function(scenery){
+ if (scenery.type == "video") scenery.seek(0)
+ })
+ }
+ base.playAll = function(){
+ base.forEach(function(scenery){
+ if (scenery.type == "video") {
+ scenery.unmute()
+ scenery.play()
+ }
+ })
+ }
+ base.pauseAll = function(){
+ base.forEach(function(scenery){
+ if (scenery.type == "video") scenery.pause()
+ })
+ }
+ base.muteAll = function(){
+ base.forEach(function(scenery){
+ if (scenery.type == "video") scenery.mx.mute()
+ })
+ }
+ base.unmuteAll = function(){
+ base.forEach(function(scenery){
+ if (scenery.type == "video") scenery.mx.unmute()
+ })
+ }
+
return base
}
diff --git a/public/assets/javascripts/rectangles/engine/scenery/move.js b/public/assets/javascripts/rectangles/engine/scenery/move.js
index 93bccb0..94c6281 100644
--- a/public/assets/javascripts/rectangles/engine/scenery/move.js
+++ b/public/assets/javascripts/rectangles/engine/scenery/move.js
@@ -2,7 +2,7 @@
Scenery.move = function(base){
var x, y, z, position, dimension, bounds
- var dragging = false
+ var dragging = false, moved = false
var oldState
this.bind = function(){
@@ -14,6 +14,7 @@ Scenery.move = function(base){
}
this.unbind = function(){
+ base.focused = false
Scenery.mouse.unbind_el(base.mx.el)
Scenery.mouse.off("down", down)
Scenery.mouse.off("enter", switch_wall)
@@ -22,29 +23,26 @@ Scenery.move = function(base){
}
function down (e, cursor){
- if (e.target != base.mx.el) return;
+ if (e.target != base.mx.el && (e.target != base.mx.overlay)) return;
if (editor.permissions.destroy) {
- UndoStack.push({
- type: 'destroy-scenery',
- undo: base.serialize(),
- redo: { id: base.id },
- })
-
- // TODO: watch individual scenery object here
- Minotaur.watch( app.router.editorView.settings )
-
- Scenery.remove(base.id)
+ base.remove()
return
}
-
+
// load the modal
app.controller.pick(base)
+ if (! base.focused) {
+ e.clickAccepted = false
+ base.focused = true
+ return
+ }
if (! (editor.permissions.move || editor.permissions.resize) ) {
e.clickAccepted = false
return
}
dragging = true
+ moved = false
x = base.mx.x
y = base.mx.y
z = base.mx.z
@@ -59,6 +57,8 @@ Scenery.move = function(base){
function drag (e, cursor){
if (! dragging) return
+
+ moved = true
var flipX = base.wall.side & (FRONT | RIGHT)
@@ -75,13 +75,14 @@ Scenery.move = function(base){
switch (base.wall.side) {
case FRONT:
case BACK:
- base.mx.x = position.a + delta.a * cos(wall_rotation[base.wall.side]) + dimension.a / 2
+ base.mx.x = position.a + delta.a * cos(base.wall.rotationY) + dimension.a / 2
break
case LEFT:
case RIGHT:
- base.mx.z = position.a + delta.a * sin(wall_rotation[base.wall.side]) + dimension.a / 2
+ base.mx.z = position.a + delta.a * sin(base.wall.rotationY) + dimension.a / 2
break
}
+
if (editor.permissions.resize) {
Scenery.resize.move_dots()
}
@@ -89,21 +90,22 @@ Scenery.move = function(base){
function up (e, cursor){
if (! dragging || ! oldState) return
-
- dragging = false
- document.body.classList.remove("dragging")
-
- UndoStack.push({
- type: 'update-scenery',
- undo: oldState,
- redo: base.serialize(),
- })
+
+ if (moved) {
+ UndoStack.push({
+ type: 'update-scenery',
+ undo: oldState,
+ redo: base.serialize(),
+ })
- // TODO: watch individual scenery object here
- Minotaur.watch( app.router.editorView.settings )
+ // TODO: watch individual scenery object here
+ Minotaur.watch( app.router.editorView.settings )
+ }
+ dragging = moved = false
oldState = null
- }
+ document.body.classList.remove("dragging")
+ }
function switch_wall (e, target, cursor){
if (! dragging) return
@@ -142,7 +144,7 @@ Scenery.move = function(base){
if (editor.permissions.resize) {
Scenery.resize.rotate_dots()
-// Scenery.resize.move_dots()
+ Scenery.resize.move_dots()
}
cursor.x.a = cursor.x.b
diff --git a/public/assets/javascripts/rectangles/engine/scenery/randomize.js b/public/assets/javascripts/rectangles/engine/scenery/randomize.js
new file mode 100644
index 0000000..6581f38
--- /dev/null
+++ b/public/assets/javascripts/rectangles/engine/scenery/randomize.js
@@ -0,0 +1,115 @@
+/*
+ // get the list of media we want to place
+ var media_objs = $(".mediaContainer").toArray().map(function(el){
+ return $(el).data("media")
+ })
+ Scenery.randomize.add( media_objs )
+*/
+
+Scenery.randomize = {};
+
+// Given a list of media objects, generate their ideal dimensions
+Scenery.randomize.get_dimensions = function (media_objs){
+ var media_list = media_objs.map(function(media){
+ var width, height
+ if (media.width > media.height) {
+ width = Math.min(DEFAULT_PICTURE_WIDTH, media.width)
+ height = media.height/media.width * width
+ }
+ else {
+ height = Math.min(DEFAULT_PICTURE_WIDTH, media.height)
+ width = media.width/media.height * height
+ }
+ return {
+ dimensions: new vec2( width, height ),
+ media: media,
+ }
+ })
+ return media_list
+}
+
+// Build the lookup of empty walls.
+// Takes a list of walls to use, or undefined to use all empty walls.
+// Returns a lookup of walls to use, keyed by wall ID.
+Scenery.randomize.get_empty_walls = function(wall_list){
+ // get a list of all walls
+ var walls = {}, removed = [];
+
+ (wall_list || Walls.list).forEach(function(wall){
+ walls[wall.id] = wall
+ })
+
+ // remove the walls that already have stuff on them
+ if (! wall_list) {
+ Scenery.forEach(function(scenery){
+ if (scenery.was_randomly_placed) {
+ // remove it and reuse this wall?
+ removed.push( scenery.serialize() )
+ Scenery.remove( scenery.id )
+ }
+ else {
+ delete walls[scenery.wall.id]
+ }
+ })
+ }
+
+ return { walls: walls, removed: removed }
+}
+
+// Randomly place a set of media objects on empty walls.
+// Only one object per wall will be added.
+// Optionally takes a list of walls to use.
+Scenery.randomize.add = function (media_objs, wall_list) {
+ var media_list = Scenery.randomize.get_dimensions(media_objs)
+ var empty_data = Scenery.randomize.get_empty_walls(wall_list)
+ var walls = empty_data.walls
+ var removed = empty_data.removed
+ var added = []
+
+ var wall_ids = _.keys(walls)
+ if (! wall_ids.length) { return }
+
+ // randomize walls
+ shuffle(wall_ids)
+ shuffle(media_list)
+
+ // assign each of the media to the walls, until we run out of either
+ media_list.some(function(media){
+ // bail if we're out of walls
+ if (wall_ids.length == 0) { return true }
+
+ var i, fits = -1
+
+ for (i = 0; i < wall_ids.length; i++) {
+ if (walls[wall_ids[i]].surface.fits(media.dimensions)) {
+ fits = i
+ break
+ }
+ }
+
+ if (fits != -1) {
+ var wall = walls[wall_ids[fits]]
+ wall_ids.splice(fits, 1)
+
+ var scenery = Scenery.add({
+ media: media.media,
+ wall: wall,
+ index: 0,
+ })
+ scenery.was_randomly_placed = true
+ added.push(scenery.serialize())
+ }
+ else {
+ // artwork won't fit anywhere??
+ }
+
+ return false
+ })
+
+ UndoStack.push({
+ type: "randomize-scenery",
+ undo: { added: added, removed: removed },
+ redo: { added: added, removed: removed },
+ })
+
+} \ No newline at end of file
diff --git a/public/assets/javascripts/rectangles/engine/scenery/resize.js b/public/assets/javascripts/rectangles/engine/scenery/resize.js
index e26c0a7..252af74 100644
--- a/public/assets/javascripts/rectangles/engine/scenery/resize.js
+++ b/public/assets/javascripts/rectangles/engine/scenery/resize.js
@@ -6,8 +6,9 @@ Scenery.resize = new function(){
var obj
var x, y, z, bounds
var dragging = false
- var naturalDimension, dimension, position, scale
+ var naturalDimension, naturalDimensionCopy, dimension, position, scale
var oldState
+ var rotationY
var dots = [], dot, selected_dot
@@ -31,7 +32,8 @@ Scenery.resize = new function(){
// generate a dot element
base.build_dot = function(side) {
var dot = new MX.Object3D('.dot')
- dot.width = dot.height = dot_side
+ dot.width = dot.height = dot_side * 2
+ dot.scale = 0.5
dot.side = side
$(dot.el).on({
mouseenter: function(){ base.hovering = true },
@@ -48,7 +50,8 @@ Scenery.resize = new function(){
// rotate the dots as appropriate
base.rotate_dots = function(){
- rotationY = wall_rotation[obj.wall.side]
+ // console.trace()
+ rotationY = obj.wall.rotationY
dots.forEach(function(dot){
dot.rotationY = rotationY
})
@@ -56,45 +59,43 @@ Scenery.resize = new function(){
// move all the dots to the object's current position
base.move_dots = function(){
- x = obj.mx.x + sin(rotationY) * dot_distance_from_picture
- y = obj.mx.y
- z = obj.mx.z - cos(rotationY) * dot_distance_from_picture
+ var x = obj.mx.x + sin(rotationY) * dot_distance_from_picture
+ var y = obj.mx.y
+ var z = obj.mx.z - cos(rotationY) * dot_distance_from_picture
dots.forEach(function(dot){
- base.move_dot(dot)
+ base.move_dot(dot, { x: x, y: y, z: z })
})
}
// move a dot .. to the initial position of the image
- base.move_dot = function(dot){
- dot.x = x
- dot.y = y
- dot.z = z
-
+ base.move_dot = function(dot, pos){
if (dot.side & TOP) {
- dot.y += obj.mx.height * obj.mx.scale / 2
+ pos.y += obj.dimensions.b / 2
}
if (dot.side & BOTTOM) {
- dot.y -= obj.mx.height * obj.mx.scale / 2
+ pos.y -= obj.dimensions.b / 2
}
if (dot.side & LEFT) {
- dot.x -= cos(rotationY) * (obj.mx.width * obj.mx.scale) / 2
- dot.z -= sin(rotationY) * (obj.mx.width * obj.mx.scale) / 2
+ pos.x -= cos(rotationY) * (obj.dimensions.a) / 2
+ pos.z -= sin(rotationY) * (obj.dimensions.a) / 2
}
if (dot.side & RIGHT) {
- dot.x += cos(rotationY) * (obj.mx.width * obj.mx.scale) / 2
- dot.z += sin(rotationY) * (obj.mx.width * obj.mx.scale) / 2
+ pos.x += cos(rotationY) * (obj.dimensions.a) / 2
+ pos.z += sin(rotationY) * (obj.dimensions.a) / 2
}
+ dot.move(pos)
}
// pick a new object to focus on and show the dots
base.show = function(new_object) {
// if (obj === new_object) return
+ if (! new_object) return
obj = new_object
-
base.add_dots()
base.rotate_dots()
base.move_dots()
+ Sculpture.resize.hide()
}
// dismiss the dots on blur
@@ -119,22 +120,13 @@ Scenery.resize = new function(){
base.bind = function(){
dots.forEach(function(dot){
Scenery.mouse.bind_el(dot.el)
- $(dot.el).bind({
- mouseenter: function(e){
- Scenery.resize.hovering = true
- },
- mouseleave: function(e){
- Scenery.resize.hovering = false
- base.defer_hide()
- }
- })
})
Scenery.mouse.on("down", down)
Scenery.mouse.on("drag", drag)
Scenery.mouse.on("up", up)
}
- this.unbind = function(){
+ base.unbind = function(){
dots.forEach(function(dot){
Scenery.mouse.unbind_el(dot.el)
})
@@ -146,15 +138,19 @@ Scenery.resize = new function(){
function down (e, cursor){
var selection = dots.filter(function(dot){return e.target == dot.el})
if (! selection.length) return
-
+
selected_dot = selection[0]
dragging = true
naturalDimension = obj.naturalDimensions
dimension = obj.dimensions
position = new vec3(obj.mx.x, obj.mx.y, obj.mx.z)
- scale = obj.mx.scale
oldState = obj.serialize()
+
+ if (obj.type == "text") {
+ naturalDimensionCopy = naturalDimension.clone()
+ positionCopy = position.clone()
+ }
document.body.classList.add("dragging")
}
@@ -167,7 +163,6 @@ Scenery.resize = new function(){
var width = cursor.x.magnitude()
var height = cursor.y.magnitude()
var mag = cursor.magnitude()
- var old_width = dimension.a * scale
if (abs(width) > abs(height)) {
mag = x_sign * mag * sign(width)
@@ -176,18 +171,23 @@ Scenery.resize = new function(){
mag = y_sign * mag * sign(height)
}
- obj.set_scale( ( dimension.a + mag ) / naturalDimension.a )
- // dimension.a // scale * (old_width + mag) / old_width
+ if (obj.type == "text") {
+ obj.mx.width = obj.media.width = naturalDimension.a = naturalDimensionCopy.a + (mag * 2)
+ obj.mx.height = obj.media.height = naturalDimension.b = naturalDimensionCopy.b + (mag * 2)
+ dimension.a = naturalDimension.a * obj.scale
+ dimension.b = naturalDimension.b * obj.scale
+ }
+ else {
+ obj.set_scale( ( dimension.a + mag ) / naturalDimension.a )
+ }
-// console.log(scale, obj.mx.scale, dimension.a + mag, naturalDimension.a)
-
- if (selected_dot.side & LEFT_RIGHT) {
- obj.mx.x = position.a + cos(rotationY) * mag/2 * (x_sign)
- obj.mx.z = position.c + sin(rotationY) * mag/2 * (x_sign)
- }
- if (selected_dot.side & TOP_BOTTOM) {
- obj.mx.y = position.b - mag/2 * y_sign
- }
+ if (selected_dot.side & LEFT_RIGHT) {
+ obj.mx.x = position.a + cos(rotationY) * mag/2 * (x_sign)
+ obj.mx.z = position.c + sin(rotationY) * mag/2 * (x_sign)
+ }
+ if (selected_dot.side & TOP_BOTTOM) {
+ obj.mx.y = position.b - mag/2 * y_sign
+ }
base.move_dots()
@@ -195,12 +195,28 @@ Scenery.resize = new function(){
}
function up (e, cursor){
+ if (! dragging) return
dragging = false
- selected_dot = null
if (! editor.permissions.resize) { return }
- obj.scale = obj.mx.ops.scale = obj.mx.scale
- obj.dimensions.assign(obj.naturalDimensions).mul(obj.scale)
+ if (obj.type == "text") {
+ var newHeight = $(obj.mx.inner).height()
+ if (selected_dot.side & BOTTOM) {
+ obj.mx.y = position.b + (naturalDimensionCopy.b - newHeight) / 2 * obj.scale
+ }
+ else {
+ obj.mx.y = dots[0].y - newHeight/2*obj.scale
+ }
+ obj.mx.height = obj.media.height = naturalDimension.b = newHeight
+ dimension.a = naturalDimension.a * obj.scale
+ dimension.b = naturalDimension.b * obj.scale
+ base.move_dots()
+ }
+ else {
+ obj.scale = obj.mx.ops.scale = obj.mx.scale
+ obj.dimensions.assign(obj.naturalDimensions).mul(obj.scale)
+ }
+
UndoStack.push({
type: 'update-scenery',
undo: oldState,
@@ -211,6 +227,7 @@ Scenery.resize = new function(){
Minotaur.watch( app.router.editorView.settings )
document.body.classList.remove("dragging")
+ selected_dot = null
}
}
diff --git a/public/assets/javascripts/rectangles/engine/scenery/sound.js b/public/assets/javascripts/rectangles/engine/scenery/sound.js
new file mode 100644
index 0000000..5a783d6
--- /dev/null
+++ b/public/assets/javascripts/rectangles/engine/scenery/sound.js
@@ -0,0 +1,16 @@
+
+Scenery.sound = {}
+Scenery.sound.max_distance = 1500
+Scenery.sound.init = function(){
+ app.tube.on("move", Scenery.sound.move)
+}
+Scenery.sound.move = function(){
+ Scenery.forEach(function(scenery){
+ if ((scenery.type == "video" || scenery.type == "audio")) { // && ! scenery.muted()) {
+ var distance = dist(cam.x, cam.z,
+ scenery.mx.x, scenery.mx.z)
+ var volume = 1 - (clamp( distance, 0, Scenery.sound.max_distance ) / Scenery.sound.max_distance)
+ scenery.setVolume(volume)
+ }
+ })
+}
diff --git a/public/assets/javascripts/rectangles/engine/scenery/types/_object.js b/public/assets/javascripts/rectangles/engine/scenery/types/_object.js
index 2dbae48..e3b9b4d 100644
--- a/public/assets/javascripts/rectangles/engine/scenery/types/_object.js
+++ b/public/assets/javascripts/rectangles/engine/scenery/types/_object.js
@@ -28,32 +28,119 @@ Scenery.types.base = Fiber.extend(function(base){
this.dimensions = this.naturalDimensions.clone().mul(this.scale)
},
+ place: function(opt){
+ if (opt.data) {
+ if (opt.wall) {
+ var position = opt.wall.mxToPosition(opt.data.position)
+ opt.index = opt.wall.surface.index_for_x( position.a, 0 )
+ }
+ this.set_wall(opt)
+ this.deserialize(opt.data)
+ }
+ else {
+ this.set_wall(opt)
+ if (this.wall && ! this.bounds) {
+ this.find_minimum_scale(opt)
+ if (! this.bounds) return
+ }
+
+ this.recenter()
+ if (opt.position) {
+ this.translateTo(opt.position)
+ }
+ var mx_position = this.wall.positionToMx( this.position, this.dimensions )
+ this.mx.move(mx_position)
+ }
+ },
+
+ find_minimum_scale: function(opt){
+ var bounds = this.wall.surface.bounds_at_index_with_dimensions(opt.index || 0, new vec2(50, 50))
+ var scale = 1
+ if (! bounds || bounds.width() < 50 || bounds.height < 50) return
+ if (this.naturalDimensions.a > bounds.width()) {
+ scale = bounds.width() / (this.naturalDimensions.a + 10)
+ }
+ if (this.naturalDimensions.b > bounds.height()) {
+ scale = Math.min(scale, bounds.height() / (this.naturalDimensions.b + 10))
+ }
+ this.set_scale(scale)
+ this.set_wall(opt)
+ },
+
recenter: function () {
if (! this.bounds) return
var center = this.bounds.center()
center.a -= this.dimensions.a / 2
center.b -= this.dimensions.b / 2
- var mx_position = this.wall.positionToMx( center, this.dimensions )
- this.mx.move(mx_position)
this.position.assign(center)
},
+ translateTo: function (position){
+ var flipX = this.wall.side & (FRONT | RIGHT)
+ var delta = position.clone().subVec(this.position)
+ delta.a -= this.dimensions.a/2
+ delta.b -= this.dimensions.b/2
+
+ if (flipX) { delta.a *= -1 }
+
+ var new_bounds = this.wall.surface.translate( this.bounds, this.dimensions, this.position, delta )
+
+ this.position.b += delta.b
+
+ switch (this.wall.side) {
+ case FRONT:
+ case BACK:
+ this.position.a += delta.a * cos(this.wall.rotationY)
+ break
+ case LEFT:
+ case RIGHT:
+ this.position.a += delta.a * sin(this.wall.rotationY)
+ break
+ }
+ },
+
bind: function(){
this.move.bind()
- $(this.mx.el).bind({
- mouseenter: this.enter,
- mouseleave: this.leave,
- })
+// $(this.mx.el).bind({
+// mouseenter: this.enter,
+// mouseleave: this.leave,
+// })
},
unbind: function(){
this.move.unbind()
- $(this.mx.el).unbind({
- mouseenter: this.enter,
- mouseleave: this.leave,
- })
+// $(this.mx.el).unbind({
+// mouseenter: this.enter,
+// mouseleave: this.leave,
+// })
},
+ remove: function(){
+ if (this.removed) return
+ this.removed = true
+
+ UndoStack.push({
+ type: 'destroy-scenery',
+ undo: this.serialize(),
+ redo: { id: this.id },
+ })
+
+ // TODO: watch individual scenery object here
+ Minotaur.watch( app.router.editorView.settings )
+
+ Scenery.remove(this.id)
+
+ Scenery.resize.hide()
+ if (app.controller.mediaEditor) {
+ app.controller.mediaEditor.tainted = false
+ app.controller.mediaEditor.hide()
+ }
+ if (app.controller.textEditor) {
+ app.controller.textEditor.tainted = false
+ app.controller.textEditor.hide()
+ }
+ },
+
destroy: function(){
this.unbind()
scene.remove(this.mx)
@@ -70,17 +157,17 @@ Scenery.types.base = Fiber.extend(function(base){
},
enter: function(e){
- if (editor.permissions.resize) {
- Scenery.resize.show(this)
- Scenery.hovering = true
- }
+// if (editor.permissions.resize) {
+// Scenery.resize.show(this)
+// Scenery.hovering = true
+// }
},
leave: function(e){
- if (editor.permissions.resize) {
- Scenery.resize.defer_hide(this)
- Scenery.hovering = false
- }
+// if (editor.permissions.resize) {
+// Scenery.resize.defer_hide(this)
+// Scenery.hovering = false
+// }
},
serialize: function(){
diff --git a/public/assets/javascripts/rectangles/engine/scenery/types/audio.js b/public/assets/javascripts/rectangles/engine/scenery/types/audio.js
new file mode 100644
index 0000000..fdd221d
--- /dev/null
+++ b/public/assets/javascripts/rectangles/engine/scenery/types/audio.js
@@ -0,0 +1,77 @@
+
+Scenery.types.audio = Scenery.types.base.extend(function(base){
+
+ var exports = {
+
+ type: 'audio',
+
+ init: function(opt){
+
+ opt.scale = 1.0
+
+ base.init.call(this, opt)
+
+ this.build()
+ this.bind()
+ this.place(opt)
+ },
+
+ build: function(){
+ this.mx = new MX.Soundcloud({
+ scale: this.scale,
+ media: this.media,
+ y: this.scale * this.media.height/2,
+ backface: false,
+ })
+ scene.add( this.mx )
+ this.mx.load()
+ },
+
+ serialize: function(){
+ var data = base.serialize.call(this)
+ return data
+ },
+
+ deserialize: function(data){
+ this.mx.move(data.position)
+ this.mx.ops.width = data.dimensions.a
+ this.mx.ops.height = data.dimensions.b
+ this.dimensions.deserialize(data.dimensions)
+ },
+
+ setVolume: function(n){
+ this.mx.setVolume(n)
+ },
+
+ play: function(){
+ this.mx.play()
+ },
+
+ pause: function(){
+ this.mx.pause()
+ },
+
+ toggle: function(){
+ this.mx.toggle()
+ },
+
+ paused: function(){
+ return this.mx.paused
+ },
+
+ muted: function(){
+ return this.mx.muted
+ },
+
+ seek: function(n){
+ this.mx.seek(n)
+ },
+
+ setLoop: function(shouldLoop){
+ this.mx.setLoop(shouldLoop)
+ },
+
+ }
+
+ return exports
+})
diff --git a/public/assets/javascripts/rectangles/engine/scenery/types/image.js b/public/assets/javascripts/rectangles/engine/scenery/types/image.js
index d2fa3ab..0e5e77c 100644
--- a/public/assets/javascripts/rectangles/engine/scenery/types/image.js
+++ b/public/assets/javascripts/rectangles/engine/scenery/types/image.js
@@ -3,27 +3,17 @@ Scenery.types.image = Scenery.types.base.extend(function(base){
var exports = {
+ type: 'image',
+
init: function(opt){
- opt.scale = opt.scale || (opt.data && opt.data.scale) || 300 / max(300, opt.media.width)
+ opt.scale = opt.scale || (opt.data && opt.data.scale) || DEFAULT_PICTURE_WIDTH / max(DEFAULT_PICTURE_WIDTH, opt.media.width)
base.init.call(this, opt)
this.build()
this.bind()
-
- if (opt.data) {
- if (opt.wall) {
- var position = opt.wall.mxToPosition(opt.data.position)
- opt.index = opt.wall.surface.index_for_x( position.a, 0 )
- }
- this.set_wall(opt)
- this.deserialize(opt.data)
- }
- else {
- this.set_wall(opt)
- this.bounds && this.recenter()
- }
+ this.place(opt)
},
build: function(){
@@ -46,6 +36,7 @@ Scenery.types.image = Scenery.types.base.extend(function(base){
this.mx.move(data.position)
this.mx.ops.width = data.dimensions.a
this.mx.ops.height = data.dimensions.b
+ this.dimensions.deserialize(data.dimensions)
},
}
diff --git a/public/assets/javascripts/rectangles/engine/scenery/types/text.js b/public/assets/javascripts/rectangles/engine/scenery/types/text.js
new file mode 100644
index 0000000..6e11da2
--- /dev/null
+++ b/public/assets/javascripts/rectangles/engine/scenery/types/text.js
@@ -0,0 +1,58 @@
+
+Scenery.types.text = Scenery.types.base.extend(function(base){
+
+ var exports = {
+
+ type: 'text',
+
+ init: function(opt){
+
+ opt.scale = 0.5
+
+ base.init.call(this, opt)
+
+ this.build()
+ this.bind()
+ this.place(opt)
+ },
+
+ build: function(){
+ this.mx = new MX.Text({
+ scale: this.scale,
+ media: this.media,
+ y: this.scale * this.media.height/2,
+ backface: false,
+ })
+ scene.add( this.mx )
+ },
+
+ setText: function(text){
+ this.media.description = text
+ this.mx.setText( text )
+ },
+
+ setFont: function(style){
+ for (var i in style) {
+ if (style.hasOwnProperty(i)) {
+ this.media.font[i] = style[i]
+ }
+ }
+ this.mx.setFont(this.media.font)
+ },
+
+ serialize: function(){
+ var data = base.serialize.call(this)
+ return data
+ },
+
+ deserialize: function(data){
+ this.mx.move(data.position)
+ this.mx.ops.width = data.dimensions.a
+ this.mx.ops.height = data.dimensions.b
+ this.dimensions.deserialize(data.dimensions)
+ },
+
+ }
+
+ return exports
+})
diff --git a/public/assets/javascripts/rectangles/engine/scenery/types/video.js b/public/assets/javascripts/rectangles/engine/scenery/types/video.js
index ef25d8d..163e19e 100644
--- a/public/assets/javascripts/rectangles/engine/scenery/types/video.js
+++ b/public/assets/javascripts/rectangles/engine/scenery/types/video.js
@@ -2,27 +2,18 @@
Scenery.types.video = Scenery.types.base.extend(function(base){
var exports = {
+
+ type: 'video',
init: function(opt){
- opt.scale = opt.scale || 300 / max(300, opt.media.width)
-
+
+ opt.scale = opt.scale || (opt.data && opt.data.scale) || DEFAULT_PICTURE_WIDTH / max(DEFAULT_PICTURE_WIDTH, opt.media.width)
+
base.init.call(this, opt)
this.build()
this.bind()
-
- if (opt.data) {
- if (opt.wall) {
- var position = opt.wall.mxToPosition(opt.data.position)
- opt.index = opt.wall.surface.index_for_x( position.a, 0 )
- }
- this.set_wall(opt)
- this.deserialize(opt.data)
- }
- else {
- this.set_wall(opt)
- this.bounds && this.recenter()
- }
+ this.place(opt)
},
build: function(){
@@ -47,7 +38,8 @@ Scenery.types.video = Scenery.types.base.extend(function(base){
backface: false,
})
scene.add(this.mx)
- this.mx.load()
+
+ this.mx.load()
},
play: function(){
@@ -99,6 +91,14 @@ Scenery.types.video = Scenery.types.base.extend(function(base){
}
},
+ unmute: function(){
+ this.mx.unmute()
+ },
+
+ setVolume: function(n){
+ this.mx.setVolume(n)
+ },
+
serialize: function(){
var data = base.serialize.call(this)
return data
@@ -106,6 +106,9 @@ Scenery.types.video = Scenery.types.base.extend(function(base){
deserialize: function(data){
this.mx.move(data.position)
+ this.mx.ops.width = data.dimensions.a
+ this.mx.ops.height = data.dimensions.b
+ this.dimensions.deserialize(data.dimensions)
},
}
diff --git a/public/assets/javascripts/rectangles/engine/scenery/undo.js b/public/assets/javascripts/rectangles/engine/scenery/undo.js
index e5624a0..b976ea2 100644
--- a/public/assets/javascripts/rectangles/engine/scenery/undo.js
+++ b/public/assets/javascripts/rectangles/engine/scenery/undo.js
@@ -4,12 +4,14 @@
type: "create-scenery",
undo: function(state){
Scenery.remove(state.id)
+ Scenery.resize.hide()
// TODO: watch individual scenery object here
Minotaur.watch( app.router.editorView.settings )
},
redo: function(state){
- Scenery.deserialize([ state ])
+ var scenery = Scenery.deserialize([ state ])
+ Scenery.resize.show( scenery )
// TODO: watch individual scenery object here
Minotaur.watch( app.router.editorView.settings )
@@ -19,8 +21,10 @@
type: "update-scenery",
undo: function(state){
var scenery = Scenery.find(state.id)
+ var wall = Walls.find( state.wall_id )
+
scenery.deserialize(state)
- scenery.set_wall(Walls.find( state.wall_id ))
+ scenery.set_wall({ wall: wall })
if (editor.permissions.resize) {
Scenery.resize.show(scenery)
@@ -31,13 +35,15 @@
},
redo: function(state){
var scenery = Scenery.find(state.id)
+ var wall = Walls.find( state.wall_id )
+
scenery.deserialize(state)
- scenery.set_wall(Walls.find( state.wall_id ))
+ scenery.set_wall({ wall: wall })
if (editor.permissions.resize) {
Scenery.resize.show(scenery)
- Scenery.resize.rotate_dots()
Scenery.resize.move_dots()
+ Scenery.resize.rotate_dots()
}
// TODO: watch individual scenery object here
@@ -47,12 +53,14 @@
{
type: "destroy-scenery",
undo: function(state){
- Scenery.deserialize([ state ])
+ var scenery = Scenery.deserialize([ state ])
+ Scenery.resize.show( scenery )
// TODO: watch individual scenery object here
Minotaur.watch( app.router.editorView.settings )
},
redo: function(state){
+ Scenery.resize.hide()
Scenery.remove(state.id)
// TODO: watch individual scenery object here
@@ -66,11 +74,11 @@
type: "create-room",
undo: function(room){
Rooms.remove(room)
- Rooms.clipper.update()
+ Rooms.rebuild()
},
redo: function(room){
Rooms.add(new Room(room))
- Rooms.clipper.update()
+ Rooms.rebuild()
app.tube("builder-pick-room", room)
},
},
@@ -80,14 +88,14 @@
var room = Rooms.list[state.id]
room.rect.assign( state.rect )
room.height = state.height
- Rooms.clipper.update()
+ Rooms.rebuild()
app.tube("builder-pick-room", room)
},
redo: function(state){
var room = Rooms.list[state.id]
room.rect.assign( state.rect )
room.height = state.height
- Rooms.clipper.update()
+ Rooms.rebuild()
app.tube("builder-pick-room", room)
},
},
@@ -95,12 +103,22 @@
type: "destroy-room",
undo: function(room){
Rooms.add(new Room(room))
- Rooms.clipper.update()
+ Rooms.rebuild()
app.tube("builder-pick-room", room)
},
redo: function(room){
Rooms.remove(room)
- Rooms.clipper.update()
+ Rooms.rebuild()
+ },
+ },
+
+ {
+ type: "update-rooms-height",
+ undo: function(state){
+ var rooms = Rooms.values()
+ rooms.forEach(function(room){
+ room.height = state
+ })
},
},
@@ -111,7 +129,32 @@
undo: function(state){
var wall = Walls.lookup[state.id]
wall.deserialize(state)
-
+ Minotaur.watch( app.router.editorView.settings )
+ },
+ },
+ {
+ type: "update-all-wallpaper",
+ undo: function(state){
+ Walls.deserialize(state)
+ Minotaur.watch( app.router.editorView.settings )
+ },
+ },
+ {
+ type: "choose-preset",
+ undo: function(state){
+ app.controller.colorControl.load(state.colors)
+ Walls.deserialize(state.walls)
+ Minotaur.watch( app.router.editorView.settings )
+ },
+ redo: function(state){
+ app.controller.presets.loadByName(state)
+ Minotaur.watch( app.router.editorView.settings )
+ },
+ },
+ {
+ type: "choose-another-preset",
+ undo: function(state){
+ app.controller.presets.loadByName(state)
Minotaur.watch( app.router.editorView.settings )
},
},
@@ -119,11 +162,103 @@
type: "update-colors",
undo: function(state){
Walls.setColor[ state.mode ]( state.rgb )
- app.router.editorView.lightControl.setSwatchColor( state.mode, state.rgb )
+ app.router.editorView.colorControl.setSwatchColor( state.mode, state.rgb )
+ Minotaur.watch( app.router.editorView.settings )
+ },
+ },
+ {
+ type: "randomize-scenery",
+ undo: function(state){
+ state.added.forEach(function(_scenery){
+ Scenery.remove(_scenery.id)
+ })
+ var scenery_list = Scenery.deserialize(state.removed)
+ scenery_list.forEach(function(scenery){
+ scenery.was_randomly_placed = true
+ })
+ Scenery.resize.hide()
+ // TODO: watch individual scenery object here
+ Minotaur.watch( app.router.editorView.settings )
+ },
+ redo: function(state){
+ state.removed.forEach(function(_scenery){
+ Scenery.remove(_scenery.id)
+ })
+ var scenery_list = Scenery.deserialize(state.added)
+ scenery_list.forEach(function(scenery){
+ scenery.was_randomly_placed = true
+ })
+
+ // TODO: watch individual scenery object here
Minotaur.watch( app.router.editorView.settings )
},
},
+ //
+ {
+ type: "create-sculpture",
+ undo: function(state){
+ Sculpture.remove(state.id)
+ Sculpture.resize.hide()
+
+ // TODO: watch individual scenery object here
+ Minotaur.watch( app.router.editorView.settings )
+ },
+ redo: function(state){
+ var scenery = Sculpture.deserialize([ state ])
+ Sculpture.resize.show( sculpture )
+
+ // TODO: watch individual scenery object here
+ Minotaur.watch( app.router.editorView.settings )
+ },
+ },
+ {
+ type: "update-sculpture",
+ undo: function(state){
+ var sculpture = Sculpture.find(state.id)
+
+ sculpture.deserialize(state)
+
+ if (editor.permissions.resize) {
+ Sculpture.resize.show(sculpture)
+ }
+
+ // TODO: watch individual scenery object here
+ Minotaur.watch( app.router.editorView.settings )
+ },
+ redo: function(state){
+ var sculpture = Sculpture.find(state.id)
+
+ sculpture.deserialize(state)
+
+ if (editor.permissions.resize) {
+ Sculpture.resize.show(sculpture)
+ Sculpture.resize.move_dots()
+ Sculpture.resize.rotate_dots()
+ }
+
+ // TODO: watch individual scenery object here
+ Minotaur.watch( app.router.editorView.settings )
+ },
+ },
+ {
+ type: "destroy-sculpture",
+ undo: function(state){
+ var sculpture = Sculpture.deserialize([ state ])
+ Sculpture.resize.show( sculpture )
+
+ // TODO: watch individual scenery object here
+ Minotaur.watch( app.router.editorView.settings )
+ },
+ redo: function(state){
+ Sculpture.resize.hide()
+ Sculpture.remove(state.id)
+
+ // TODO: watch individual scenery object here
+ Minotaur.watch( app.router.editorView.settings )
+ },
+ },
+
])
})()