Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
Added mouselook, move mouse event handlers into WebGLContext
  • Loading branch information
sinisterchipmunk committed Nov 17, 2010
1 parent 8fc8bd8 commit 1098e70
Show file tree
Hide file tree
Showing 13 changed files with 379 additions and 161 deletions.
4 changes: 4 additions & 0 deletions app/controllers/engine_tests_controller.rb
@@ -1,6 +1,10 @@
class EngineTestsController < ApplicationController
layout :choose_layout
include WebGL

def mouse_weight
dependencies << "control/mouse_weight"
end

def octree
dependencies << "engine/heightmap" << "culling/octree" << "objects/sphere" << "objects/cube"
Expand Down
4 changes: 3 additions & 1 deletion app/controllers/shooter_controller.rb
Expand Up @@ -4,6 +4,8 @@ class ShooterController < ApplicationController

def index
dependencies << "objects/cube" << "objects/md2" << "objects/line"
dependencies << "control/mouse_weight"

@hiscore = ShooterStats.new
end

Expand All @@ -21,4 +23,4 @@ def create
def scores
@scores = ShooterStats.find(:all, :order => "kills DESC, accuracy DESC, shots_fired ASC")
end
end
end
1 change: 1 addition & 0 deletions app/models/creature.rb
@@ -1,6 +1,7 @@
class Creature < ActiveRecord::Base
# serialize :orientation, WebGL::World::Camera
belongs_to :actor
belongs_to :scene, :polymorphic => true
delegate :view, :up, :right, :position, :view=, :up=, :position=, :right=, :to => :orientation

def name
Expand Down
127 changes: 42 additions & 85 deletions app/views/engine_tests/animation_editor.html.erb
Expand Up @@ -155,12 +155,10 @@
{
var canvas = contexts[i].canvas;
canvas.context = contexts[i];
canvas.onclick = canvas_clicked;
canvas.onmousemove = mouse_moved;
canvas.onmouseover = mouse_over;
canvas.onmouseout = mouse_out;
canvas.onmousedown = mouse_down;
canvas.onmouseup = mouse_up;
contexts[i].onMouseMove(mouse_moved);
contexts[i].onMouseDrag(mouse_dragged);
contexts[i].onMousePress(mouse_down);
contexts[i].onMouseRelease(mouse_up);
}
initializationComplete();
Expand Down Expand Up @@ -192,95 +190,60 @@
document.getElementById('framerate').innerHTML = "Avg FPS: "+frame_count;
}
function canvas_clicked(event) {
logger.attempt("canvas_clicked", function() {
});
}
function mouse_moved(event) {
if (!skeleton) return;
var self = this;
logger.attempt("mouse_moved", function() {
// FIXME doesn't account for scroll offsets
mouse.target = self;
mouse.overCanvas = true;
mouse.offsetx = mouse.x;
mouse.offsety = mouse.y;
mouse.x = event.clientX - $(self).cumulativeOffset()[0];
mouse.y = event.clientY - $(self).cumulativeOffset()[1];
if (mouse.offsetx)
mouse.diffx = mouse.x - mouse.offsetx;
if (mouse.offsety)
mouse.diffy = mouse.y - mouse.offsety;
highlighted_bone = mouse.target.context.world.pickIndex(mouse.x, mouse.y);
highlighted_bone = mouse.context.world.pickIndex(mouse.x, mouse.y);
});
}
function mouse_dragged(event) {
if (!skeleton) return;
var self = event.source;
logger.attempt("mouse_moved", function() {
highlighted_bone = mouse.context.world.pickIndex(mouse.x, mouse.y);
if (mouse.down == null) {
//mouse moved
}
else
{//mouse dragged
var mode = $('dragModeTranslate').checked ? 'translate' : 'rotate';
var axisX, axisY, neg = -1;
var mode = $('dragModeTranslate').checked ? 'translate' : 'rotate';
var axisX, axisY, neg = -1;
if (self.id == 'canvas-top') { axisX = 0; axisY = 2; neg = 1; }
if (self.id == "canvas-left"){ axisX = 2; axisY = 1; }
if (self.id == "canvas-front"){axisX = 0; axisY = 1; }
if (self.id == 'canvas-top') { axisX = 0; axisY = 2; neg = 1; }
if (self.id == "canvas-left"){ axisX = 2; axisY = 1; }
if (self.id == "canvas-front"){axisX = 0; axisY = 1; }
if (currentKeyframe == null) // rest state
{
if (MODE == 'edit' && selected_bone) {
skeleton.all[selected_bone].offset[axisX] += mouse.diffx / 300;
skeleton.all[selected_bone].offset[axisY] += mouse.diffy / 300*neg;
skeleton.refresh();
}
} else { // animation state
if (mode == "translate") {
skeleton.keyframes[currentKeyframe].offset[axisX] += mouse.diffx / 300;
skeleton.keyframes[currentKeyframe].offset[axisY] += mouse.diffy / 300 * neg;
skeleton.matchKeyframe(currentKeyframe);
}
else {
if (selected_bone) {
if (self.id == 'canvas-top') { axisY = 1; }
if (self.id == "canvas-left"){ axisY = 0; }
if (self.id == "canvas-front"){axisY = 2; }
if (currentKeyframe == null) // rest state
{
if (MODE == 'edit' && selected_bone) {
skeleton.all[selected_bone].offset[axisX] += mouse.diffx / 300;
skeleton.all[selected_bone].offset[axisY] += mouse.diffy / 300*neg;
skeleton.refresh();
}
} else { // animation state
if (mode == "translate") {
skeleton.keyframes[currentKeyframe].offset[axisX] += mouse.diffx / 300;
skeleton.keyframes[currentKeyframe].offset[axisY] += mouse.diffy / 300 * neg;
skeleton.matchKeyframe(currentKeyframe);
}
else {
if (selected_bone) {
if (self.id == 'canvas-top') { axisY = 1; }
if (self.id == "canvas-left"){ axisY = 0; }
if (self.id == "canvas-front"){axisY = 2; }
var rotation = (-mouse.diffy + mouse.diffx) / 300;
var rotations = skeleton.keyframes[currentKeyframe].rotations;
var rotationIndex = skeleton.all[selected_bone].index * 3;
rotations[rotationIndex+axisY] += rotation;
skeleton.matchKeyframe(currentKeyframe);
}
var rotation = (-mouse.diffy + mouse.diffx) / 300;
var rotations = skeleton.keyframes[currentKeyframe].rotations;
var rotationIndex = skeleton.all[selected_bone].index * 3;
rotations[rotationIndex+axisY] += rotation;
skeleton.matchKeyframe(currentKeyframe);
}
}
updateForm();
}
});
}
function mouse_over(event) {
logger.attempt("mouse_over", function() {
});
}
function mouse_out(event) {
logger.attempt("mouse_out", function() {
updateForm();
});
}
function mouse_down(event) {
logger.attempt("mouse_down", function() {
var button = event.which;
mouse.down = mouse.down || {count:0,down:{}};
button = mouse.down["button"+button] = {at:[mouse.x,mouse.y]};
//mouse pressed
if (highlighted_bone) selected_bone = highlighted_bone;
});
Expand All @@ -293,13 +256,7 @@
var at = mouse.down["button"+event.which].at;
if (at[0] == mouse.x && at[1] == mouse.y)
selectBone(highlighted_bone);
mouse.down.count--;
if (mouse.down.count <= 0)
mouse.down = null;
}
//mouse released
});
}
Expand Down
12 changes: 12 additions & 0 deletions app/views/engine_tests/mouse_weight.html.erb
@@ -0,0 +1,12 @@
<script>
<%content_for :global do%>
var mouselook;
<%end%>
<%content_for :init do%>
mouselook = new MouseWeight(world);
world.addObject(new Quad(1,1));
world.addObject(mouselook); // to render boundaries. Skip this if visual cues are unnecessary.
world.camera.move(-10);
<%end%>
</script>
3 changes: 3 additions & 0 deletions app/views/engine_tests/webgl_text.html.erb
Expand Up @@ -8,6 +8,9 @@
/* Example of 2D text which tracks updates-per-second */
var text2d = new Text("Hello, world! (2D)", {
type: "2d",
x:-400,
y:-250,
align: {x:"left",y:"bottom"},
update: function(tc) {
this.frames = this.frames || 0;
this.timer = this.timer || 0;
Expand Down
4 changes: 2 additions & 2 deletions app/views/layouts/engine_bare.html.erb
Expand Up @@ -15,7 +15,7 @@
// this is used to disable context.checkError(), which is slow.
// it may be worth noting that context.checkError() is particularly
// slow on Chrome; FF gets a much better framerate (40+).
var RELEASE = true;
var RELEASE = false;
var context = null;
var gl = null;
var frame_count = 0;
Expand Down Expand Up @@ -75,7 +75,7 @@
<style>
<%=yield :style%>
</style>
<%=render :partial => "layouts/google_analytics"%>
<%#=render :partial => "layouts/google_analytics"%>
</head>
<body onload="webGLStart();">
<div id="framerate" style="float:left;width:100px;clear:both;">Calculating...</div>
Expand Down
68 changes: 21 additions & 47 deletions app/views/layouts/engine_tests.html.erb
Expand Up @@ -64,12 +64,19 @@
var canvas = document.getElementById("canvas");
canvas.onclick = canvas_clicked;
canvas.onmousemove = mouse_moved;
canvas.onmouseover = mouse_over;
canvas.onmouseout = mouse_out;
canvas.onmousedown = mouse_down;
canvas.onmouseup = mouse_up;
context.onMouseClick(canvas_clicked);
context.onMouseMove(mouse_moved);
context.onMouseIn(mouse_over);
context.onMouseOut(mouse_out);
context.onMousePress(mouse_down);
context.onMouseRelease(mouse_up);
context.onMouseDrag(mouse_dragged);
// canvas.onclick = canvas_clicked;
// canvas.onmousemove = mouse_moved;
// canvas.onmouseover = mouse_over;
// canvas.onmouseout = mouse_out;
// canvas.onmousedown = mouse_down;
// canvas.onmouseup = mouse_up;
initializationComplete();
context.checkError();
Expand All @@ -94,35 +101,14 @@
function mouse_moved(event) {
var self = this;
logger.attempt("mouse_moved", function() {
// FIXME doesn't account for scroll offsets
mouse.overCanvas = true;
mouse.offsetx = mouse.x;
mouse.offsety = mouse.y;
mouse.x = event.clientX - $(self).cumulativeOffset()[0]-1;
mouse.y = event.clientY - $(self).cumulativeOffset()[1]-1;
// add scroll offsets
if (window.pageXOffset)
{
mouse.x += window.pageXOffset;
mouse.y += window.pageYOffset;
}
else
{
mouse.x += document.body.scrollLeft;
mouse.y += document.body.scrollTop;
}
if (mouse.offsetx)
mouse.diffx = mouse.x - mouse.offsetx;
if (mouse.offsety)
mouse.diffy = mouse.y - mouse.offsety;
if (mouse.down == null) {
<%=yield :mouse_moved%>
}
else
{
<%=yield :mouse_dragged%>
}
<%=yield :mouse_moved%>
});
}
function mouse_dragged(event) {
var self = this;
logger.attempt("mouse_moved", function() {
<%=yield :mouse_dragged%>
});
}
Expand All @@ -140,24 +126,12 @@
function mouse_down(event) {
logger.attempt("mouse_down", function() {
var button = event.which;
mouse.down = mouse.down || {count:0,down:{}};
button = mouse.down["button"+button] = {at:[mouse.x,mouse.y]};
<%=yield :mouse_pressed%>
});
}
function mouse_up(event) {
logger.attempt("mouse_up", function() {
if (mouse.down)
{
mouse.down.count--;
if (mouse.down.count <= 0)
mouse.down = null;
}
<%=yield :mouse_released%>
});
}
Expand Down

0 comments on commit 1098e70

Please sign in to comment.