
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.75294117647058822, 0.75294117647058822, 0.75294117647058822, 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 = [-0.000000,-10.000000,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 setViewMatrix(){
	g_viewInfo.drawContext.view = g_math.matrix4.lookAt([6.2827177047729492, -5.0, 5.8667974472045898], //[0, 1, 5],  // eye
		[5.6554775238037109, -4.5067005157470703, 5.2641158103942871], //[0, 0, 0],  // target
		[5.7924151420593262, -4.64886474609375, 6.6644859313964844]); //[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], [0.0, 0.0, 0.0, 1.0]];
	Transform2.parent = Transform1;
	Transform2.addShape(g_shapes.Shape3);
	return Transform1;
}

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

	g_shapes.Shape3 = createShape3();
}
