
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;
var g_currentview = 0;

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 createShape2(){
	var Shape2 = g_pack.createObject('Shape');
	var Primitive8 = g_pack.createObject('Primitive');
	Primitive8.owner = Shape2;
	Primitive8.primitiveType = g_o3d.Primitive.TRIANGLELIST;
	Primitive8.numberPrimitives = 12;
	Primitive8.numberVertices = 24;
	Primitive8.createDrawElement(g_pack, null);
	
	var StreamBank3 = g_pack.createObject('StreamBank');
	var VertexBuffer4 = g_pack.createObject('VertexBuffer');
	var VertexBuffer4Array = [
				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 FloatField5 = VertexBuffer4.createField('FloatField', 3);
	VertexBuffer4.set(VertexBuffer4Array);
	StreamBank3.setVertexStream(
		1,0,FloatField5,0);
	var VertexBuffer6 = g_pack.createObject('VertexBuffer');
	var VertexBuffer6Array = [
				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 FloatField7 = VertexBuffer6.createField('FloatField', 3);
	VertexBuffer6.set(VertexBuffer6Array);
	StreamBank3.setVertexStream(
		2,0,FloatField7,0);
	Primitive8.streamBank = StreamBank3;
	Primitive8.material = createMaterial10();
	
	var IndexBuffer9 = g_pack.createObject('IndexBuffer');
	var IndexBuffer9Array = [
				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
	];
	IndexBuffer9.set(IndexBuffer9Array);
	Primitive8.indexBuffer = IndexBuffer9;
	return Shape2;
}

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

function createAnimationShape2(transform){
	var counter = g_pack.createObject('SecondCounter');
	counter.multiplier=1.0
	var trs = g_pack.createObject('TRSToMatrix4');
	transform.getParam('localMatrix').bind(trs.getParam('output'));
	var functionEval, curve; 
	
	functionEval = g_pack.createObject('FunctionEval'); 
	trs.getParam('rotateX').bind(functionEval.getParam('output'));
	curve = g_pack.createObject('Curve'); 
	functionEval.functionObject = curve;
	curve.addLinearKeys([0.040000000000000001, 0.0, 0.80000000000000004, -0.78803877084204588, 1.6000000000000001, -0.0010764658372181906, 2.3999999999999999, -0.0010764658372181906, 3.2000000000000002, -0.0010764659184914172, 4.0, -0.0010764658372181906, 4.7999999999999998, -0.0010764659184914172]);
	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('rotateY').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.78857905964819563, 3.2000000000000002, -0.0062079949485428342, 4.0, -0.0062079832451981997, 4.7999999999999998, 0.0]);
	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('rotateZ').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, 1.1985449716419512e-11, 3.2000000000000002, 1.3925818781526952e-11, 4.0, -0.79045625532156538, 4.7999999999999998, 0.0]);
	curve.preInfinity = g_o3d.Curve.CONSTANT;
	curve.postInfinity = g_o3d.Curve.CYCLE;
	functionEval.getParam('input').bind(counter.getParam('count'));
	
}

function setViewMatrix(){
	g_currentview += 1;
	if (g_currentview > 1.000000) {
		g_currentview = 1;
	}
	
	switch ( g_currentview){
	case 1.000000:
		g_viewInfo.drawContext.view = g_math.matrix4.lookAt([0.0070159658789634705, -8.0887250900268555, 5.0863757133483887], //[0, 1, 5],  // eye
			[-0.031280543655157089, -7.2217178344726563, 4.5895543098449707], //[0, 0, 0],  // target
			[-0.042915906757116318, -7.5938200950622559, 5.9538869857788086]); //[0, 1, 0]); // up
		break
	}
}

function createTransformGraph(){
	Transform0 = g_pack.createObject('Transform');
	Transform0.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]];
	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]];
	Transform1.parent = Transform0;
	Transform1.addShape(g_shapes.Shape2);
	createAnimationShape2(Transform1);
	return Transform0;
}

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

	g_shapes.Shape2 = createShape2();
}
