
o3djs.require('o3djs.util'); //Utility Libraries
o3djs.require('o3djs.math');
o3djs.require('o3djs.rendergraph');

window.onload = init; //Events
window.onunload = uninit;

// Global Variables
var g_client;
var g_o3d;
var g_math;
var g_pack;
var g_clock = 0;
var g_rootTransform;
var g_fixedFunctionEffect;
var g_viewInfo;
var g_shapes;

function init() {
    o3djs.util.makeClients(initStep2);
}

function renderCallback(renderEvent) {
    g_clock += renderEvent.elapsedTime;
    
    // g_rootTransform.identity();
    // g_rootTransform.rotateY(2.0 * g_clock);
}

function uninit() {
}

function initStep2(clientElements) {
    var o3dElement = clientElements[0];
    g_client = o3dElement.client;  
    g_o3d = o3dElement.o3d; 
    g_math = o3djs.math;    

    g_pack = g_client.createPack(); 

    g_viewInfo = o3djs.rendergraph.createBasicView(g_pack, 
                                                     g_client.root, 
                                                     g_client.renderGraphRoot);
    
    g_viewInfo.drawContext.projection = g_math.matrix4.perspective(   
                                                       g_math.degToRad(30), // 30 degree fov.   
                                                       g_client.width / g_client.height,
                                                       1,                  // Near plane.
                                                       5000);              // Far plane.

    setViewMatrix();

    // Vertex and Pixel Shader are hidden in <textarea> element
    g_fixedFunctionEffect = g_pack.createObject('Effect');
   
    var shaderString = document.getElementById('effect').value; 
    g_fixedFunctionEffect.loadFromFXString(shaderString);
   
    //Create Geometry    
    createGeometry();

    //Create Transformgraph
    g_rootTransform = createTransformGraph();
    g_rootTransform.parent = g_client.root;
    
    
    g_client.setRenderCallback(renderCallback);
}



function createShape3(){
	var Shape3 = g_pack.createObject('Shape');
	var Primitive9 = g_pack.createObject('Primitive');
	Primitive9.owner = Shape3;
	Primitive9.primitiveType = g_o3d.Primitive.TRIANGLELIST;
	Primitive9.numberPrimitives = 12;
	Primitive9.numberVertices = 24;
	Primitive9.createDrawElement(g_pack, null);
	
	var StreamBank4 = g_pack.createObject('StreamBank');
	var VertexBuffer5 = g_pack.createObject('VertexBuffer');
	var VertexBuffer5Array = [
				0.999985276947,0.999985098133,-0.999985217342,
				0.999985276947,-0.999985336552,-0.999985217342,
				-0.999985157738,-0.999985336552,-0.999985217342,
				-0.999985157738,0.999985098133,-0.999985217342,
				0.999985276947,0.999985098133,0.999985217342,
				-0.999985157738,0.999985098133,0.999985217342,
				-0.999985157738,-0.999985336552,0.999985217342,
				0.999985276947,-0.999985336552,0.999985217342,
				0.999985276947,0.999985098133,-0.999985217342,
				0.999985276947,0.999985098133,0.999985217342,
				0.999985276947,-0.999985336552,0.999985217342,
				0.999985276947,-0.999985336552,-0.999985217342,
				0.999985276947,-0.999985336552,-0.999985217342,
				0.999985276947,-0.999985336552,0.999985217342,
				-0.999985157738,-0.999985336552,0.999985217342,
				-0.999985157738,-0.999985336552,-0.999985217342,
				-0.999985157738,-0.999985336552,-0.999985217342,
				-0.999985157738,-0.999985336552,0.999985217342,
				-0.999985157738,0.999985098133,0.999985217342,
				-0.999985157738,0.999985098133,-0.999985217342,
				0.999985276947,0.999985098133,0.999985217342,
				0.999985276947,0.999985098133,-0.999985217342,
				-0.999985157738,0.999985098133,-0.999985217342,
				-0.999985157738,0.999985098133,0.999985217342
	];
	var FloatField6 = VertexBuffer5.createField('FloatField', 3);
	VertexBuffer5.set(VertexBuffer5Array);
	StreamBank4.setVertexStream(
		1,0,FloatField6,0);
	var VertexBuffer7 = g_pack.createObject('VertexBuffer');
	var VertexBuffer7Array = [
				0.0,0.0,-1.0,
				0.0,0.0,-1.0,
				0.0,0.0,-1.0,
				0.0,0.0,-1.0,
				0.0,0.0,1.0,
				0.0,0.0,1.0,
				0.0,0.0,1.0,
				0.0,0.0,1.0,
				1.0,0.0,0.0,
				1.0,0.0,0.0,
				1.0,0.0,0.0,
				1.0,0.0,0.0,
				0.0,-1.0,0.0,
				0.0,-1.0,0.0,
				0.0,-1.0,0.0,
				0.0,-1.0,0.0,
				-1.0,0.0,0.0,
				-1.0,0.0,0.0,
				-1.0,0.0,0.0,
				-1.0,0.0,0.0,
				0.0,1.0,0.0,
				0.0,1.0,0.0,
				0.0,1.0,0.0,
				0.0,1.0,0.0
	];
	var FloatField8 = VertexBuffer7.createField('FloatField', 3);
	VertexBuffer7.set(VertexBuffer7Array);
	StreamBank4.setVertexStream(
		2,0,FloatField8,0);
	Primitive9.streamBank = StreamBank4;
	Primitive9.material = createMaterial11();
	
	var IndexBuffer10 = g_pack.createObject('IndexBuffer');
	var IndexBuffer10Array = [
				1,2,0,
				0,2,3,
				5,6,4,
				4,6,7,
				9,10,8,
				8,10,11,
				13,14,12,
				12,14,15,
				17,18,16,
				16,18,19,
				21,22,20,
				20,22,23
	];
	IndexBuffer10.set(IndexBuffer10Array);
	Primitive9.indexBuffer = IndexBuffer10;
	return Shape3;
}

function createMaterial11(){
	var Material11 = g_pack.createObject('Material');
	Material11.drawList = g_viewInfo.performanceDrawList;
	Material11.effect = g_fixedFunctionEffect;
	g_fixedFunctionEffect.createUniformParameters(Material11);
	var ambientColorParameter = Material11.getParam('ambientColor');
	ambientColorParameter.value = [0.00078431372549019615, 0.00078431372549019615, 0.00078431372549019615, 1.0];
	var diffuseColorParameter = Material11.getParam('diffuseColor');
	diffuseColorParameter.value = [0.80000000000000004, 0.031372549019607843, 0.031372549019607843, 1.0];
	var emissiveColorParameter = Material11.getParam('emissiveColor');
	emissiveColorParameter.value = [0.0, 0.0, 0.0, 1.0];
	var specularColorParameter = Material11.getParam('specularColor');
	specularColorParameter.value = [0.0, 0.0, 0.0, 1.0];
	var shininessParameter = Material11.getParam('shininess');
	shininessParameter.value = 0.0;
	var lightWorldPositionParameter = Material11.getParam('lightWorldPosition');
	lightWorldPositionParameter.value = [-2.844819,4.579698,7.000000];
	var lightColorParameter = Material11.getParam('lightColor');
	lightColorParameter.value = [1.0, 1.0, 1.0, 1.0];
	var lightIntensityParameter = Material11.getParam('lightIntensity');
	lightIntensityParameter.value = [1.000000,1.000000,1.000000,1.0];
	return Material11;
}

function createAnimationShape3(transform){
	var counter = g_pack.createObject('SecondCounter');
	var trs = g_pack.createObject('TRSToMatrix4');
	transform.getParam('localMatrix').bind(trs.getParam('output'));
	var functionEval, curve; 
	
	functionEval = g_pack.createObject('FunctionEval'); 
	trs.getParam('translateX').bind(functionEval.getParam('output'));
	curve = g_pack.createObject('Curve'); 
	functionEval.functionObject = curve;
	curve.addLinearKeys([0.040000000000000001, -5.9544730186462402, 0.80000000000000004, 6.0040936470031738, 1.6000000000000001, 6.0040936470031738, 2.3999999999999999, -5.9544730186462402]);
	curve.preInfinity = g_o3d.Curve.CONSTANT;
	curve.postInfinity = g_o3d.Curve.CYCLE;
	functionEval.getParam('input').bind(counter.getParam('count'));
	
	functionEval = g_pack.createObject('FunctionEval'); 
	trs.getParam('translateY').bind(functionEval.getParam('output'));
	curve = g_pack.createObject('Curve'); 
	functionEval.functionObject = curve;
	curve.addLinearKeys([0.040000000000000001, 5.1109223365783691, 0.80000000000000004, 5.011681079864502, 1.6000000000000001, -5.0613017082214355, 2.3999999999999999, 5.1109223365783691]);
	curve.preInfinity = g_o3d.Curve.CONSTANT;
	curve.postInfinity = g_o3d.Curve.CYCLE;
	functionEval.getParam('input').bind(counter.getParam('count'));
	
	functionEval = g_pack.createObject('FunctionEval'); 
	trs.getParam('translateZ').bind(functionEval.getParam('output'));
	curve = g_pack.createObject('Curve'); 
	functionEval.functionObject = curve;
	curve.addLinearKeys([0.040000000000000001, 0.0, 0.80000000000000004, 0.0, 1.6000000000000001, 0.0, 2.3999999999999999, 0.0]);
	curve.preInfinity = g_o3d.Curve.CONSTANT;
	curve.postInfinity = g_o3d.Curve.CYCLE;
	functionEval.getParam('input').bind(counter.getParam('count'));
	
}

function setViewMatrix(){
	g_viewInfo.drawContext.view = g_math.matrix4.lookAt([9.7065391540527344, -7.977236270904541, 5.8667974472045898], //[0, 1, 5],  // eye
		[9.0792989730834961, -7.3775568008422852, 5.3698530197143555], //[0, 0, 0],  // target
		[9.2162361145019531, -7.7855215072631836, 6.7170028686523437]); //[0, 1, 0]); // up
}

function createTransformGraph(){
	Transform1 = g_pack.createObject('Transform');
	Transform1.localMatrix    =[[1.0, 0.0, 0.0, 0.0], [0.0, 1.0, 0.0, 0.0], [0.0, 0.0, 1.0, 0.0], [0.0, 0.0, 0.0, 1.0]];
	Transform2 = g_pack.createObject('Transform');
	Transform2.localMatrix    =[[1.0, 0.0, 0.0, 0.0], [0.0, 1.0, 0.0, 0.0], [0.0, 0.0, 1.0, 0.0], [-5.9544730186462402, 5.1109223365783691, 0.0, 1.0]];
	Transform2.parent = Transform1;
	Transform2.addShape(g_shapes.Shape3);
	createAnimationShape3(Transform2);
	return Transform1;
}

function createGeometry(){
	g_shapes = new Object();

	g_shapes.Shape3 = createShape3();
}
