/**
* Querying node World, View and Canvas-space origins via a "rendered" event
*
* For each of these teapots we're listening to "rendered" events on their scene nodes, which report
* their centre points in various coordinate systems, along with the Model, View and Projection matrices
* that are applied to them.
*
* Using the Canvas space centers, we can then float a DIV over each teapot on the canvas to report its center points.
*
* More info:
*
* https://github.com/xeolabs/scenejs/wiki/Node-Events
*
*/
SceneJS.createScene({
type: "scene",
id: "my-scene",
canvasId: "theCanvas",
loggingElementId: "theLoggingDiv",
nodes: [
{
type: "lookAt",
eye : { x: -0.0, y: 0.0, z: -35.0},
look : { x : 0.0, y : 0.0, z : 0 },
up : { x: 0.0, y: 1.0, z: 0.0 },
nodes: [
{
type: "camera",
optics: {
type: "perspective",
fovy : 65.0,
aspect : 1.47,
near : 0.10,
far : 300.0
},
nodes: [
{
type: "light",
mode: "dir",
color: { r: 1.0, g: 1.0, b: 1.0 },
diffuse: true,
specular: true,
dir: { x: 1.0, y: 1.0, z: 1.0 }
},
{
type: "light",
mode: "dir",
color: { r: 0.8, g: 0.8, b: 0.8 },
diffuse: true,
specular: true,
dir: { x: -2.0, y: -1.0, z: -1.0 }
},
{
type: "material",
baseColor: { r: 0.6, g: 0.9, b: 0.6 },
specularColor: { r: 0.6, g: 0.9, b: 0.6 },
specular: 0.9,
shine: 6.0,
nodes: [
{
type: "rotate",
id: "yaw",
angle: 0.0,
y : 1.0,
nodes: [
{
type: "translate",
x : -20.0,
nodes: [
{
type: "node",
id: "teapot1",
nodes: [
{
type: "material",
baseColor: { r: 1.0, g: 0.4, b: 0.4 },
specularColor: { r: 1.0, g: 0.4, b: 0.4 },
specular: 0.9,
shine: 6.0,
nodes: [
{
type: "teapot",
id: "teapot-geometry"
}
]
}
]
},
{
type: "rotate",
id: "pitch",
angle: -40.0,
x : 1.0,
nodes: [
{
type: "translate",
z : -20.0,
id: "teapot2",
nodes: [
{
type: "material",
baseColor: { r: 0.4, g: 1.0, b: 0.4 },
specularColor: { r: 0.4, g: 1.0, b: 0.4 },
specular: 0.9,
shine: 6.0,
nodes: [
{
type: "teapot",
id: "teapot2-geometry"
}
]
}
]
},
{
type: "translate",
z : 20.0,
id: "teapot3",
nodes: [
{
type: "material",
baseColor: { r: 0.4, g: 0.4, b: 1.0 },
specularColor: { r: 0.4, g: 0.4, b: 1.0 },
specular: 0.9,
shine: 6.0,
nodes: [
{
type: "teapot",
id: "teapot3-geometry"
}
]
}
]
}
]
}
]
}
]
}
]
}
]
}
]
}
]
});
/*----------------------------------------------------------------------
* Scene rendering loop and mouse handler stuff follows
*---------------------------------------------------------------------*/
var scene = SceneJS.scene("my-scene");
var yaw = -0;
var pitch = -40;
scene.findNode("teapot1").bind(
"rendered",
function (event) {
var params = event.params;
updateLabelPos(
"teapot1",
params.getCanvasPos(),
params.getProjPos(),
params.getCameraPos(),
params.getViewPos(),
params.getWorldPos());
});
scene.findNode("teapot2").bind(
"rendered",
function (event) {
var params = event.params;
updateLabelPos(
"teapot2",
params.getCanvasPos(),
params.getProjPos(),
params.getCameraPos(),
params.getViewPos(),
params.getWorldPos());
});
scene.findNode("teapot3").bind(
"rendered",
function (event) {
var params = event.params;
updateLabelPos(
"teapot3",
params.getCanvasPos(),
params.getProjPos(),
params.getCameraPos(),
params.getViewPos(),
params.getWorldPos());
});
scene.start({
idleFunc: function() {
scene.findNode("pitch").set("angle", pitch);
scene.findNode("yaw").set("angle", yaw);
yaw += 0.1;
pitch += 0.1;
}
});
function updateLabelPos(elementId, canvasPos, projPos, cameraPos, viewPos, worldPos) {
var offset = $("#theCanvas").offset();
$("#" + elementId).html(elementId
+ "
"
+ "
Canvas: " + Math.round(canvasPos.x) + ", " + Math.round(canvasPos.y)
+ "
Proj : " + Math.round(projPos.x) + ", " + Math.round(projPos.y)
+ "
Camera : " + roundFloat(cameraPos.x) + ", " + roundFloat(cameraPos.y) + ", " + roundFloat(cameraPos.z)
+ "
View : " + roundFloat(viewPos.x) + ", " + roundFloat(viewPos.y) + ", " + roundFloat(viewPos.z)
+ "
World : " + roundFloat(worldPos.x) + ", " + roundFloat(worldPos.y) + ", " + roundFloat(worldPos.z)
);
$("#" + elementId).css("left", offset.left + canvasPos.x);
$("#" + elementId).css("top", offset.top + canvasPos.y);
}
function roundFloat(v) {
return Math.round(v * 10) / 10;
}