changeset 142:dc68420f705f draft

add xml
author gongo@gendarme.cr.ie.u-ryukyu.ac.jp
date Sat, 29 Nov 2008 02:39:43 +0900
parents 56db76a03294
children 9588726193e1
files TaskManager/Test/test_render/Makefile.def TaskManager/Test/test_render/SceneGraph.cpp TaskManager/Test/test_render/SceneGraph.h TaskManager/Test/test_render/cube_action.cpp TaskManager/Test/test_render/node.cpp TaskManager/Test/test_render/task/CreateSpan.cpp TaskManager/Test/test_render/viewer.cpp TaskManager/Test/test_render/xml_file/cube_split.h TaskManager/Test/test_render/xml_file/cube_split.xml
diffstat 9 files changed, 470 insertions(+), 116 deletions(-) [+]
line wrap: on
line diff
--- a/TaskManager/Test/test_render/Makefile.def	Sat Nov 29 01:18:32 2008 +0900
+++ b/TaskManager/Test/test_render/Makefile.def	Sat Nov 29 02:39:43 2008 +0900
@@ -3,15 +3,15 @@
 # include/library path
 # ex: macosx
 #CERIUM = /Users/gongo/Source/Concurrency/Game_project/Cerium
-#CERIUM = /Users/gongo/Source/hg/Cerium
+CERIUM = /Users/gongo/Source/hg/Cerium
 
 # ex: linux/ps3
-CERIUM = /home/gongo/Cerium
+#CERIUM = /home/gongo/Cerium
 
 #CERIUM = ../../..
 
 CC      = g++
-CFLAGS  = -O9 -g -Wall# -DDEBUG
+CFLAGS  = -O0 -g -Wall# -DDEBUG
 
 INCLUDE = -I$(CERIUM)/include/TaskManager -I.
 LIBS = -L$(CERIUM)/TaskManager
--- a/TaskManager/Test/test_render/SceneGraph.cpp	Sat Nov 29 01:18:32 2008 +0900
+++ b/TaskManager/Test/test_render/SceneGraph.cpp	Sat Nov 29 02:39:43 2008 +0900
@@ -55,6 +55,8 @@
     texture_id = -1;
     move = no_move;
     collision = no_collision;
+
+    frame = 0;
 }
 
 /* construct polygon from xmlNode.  */
@@ -133,10 +135,10 @@
 {
     SceneGraph *tmp;
 
-    /* childrenのリストの最後に加える */
+    /* childrenのリストの最後に加える (brother として)*/
     if (this->lastChild != NULL) {
 	tmp = this->lastChild;
-	tmp->children = child;
+	tmp->brother = child;
     }
 
     this->lastChild = child;
@@ -392,6 +394,8 @@
 	t->move_execute(screen_w, screen_h);
 	t->collision_check(screen_w, screen_h, top);
 
+	t->frame++;
+
 	if (t->parent != NULL) {
 	    get_matrix(t->matrix, t->angle, t->xyz, t->parent->matrix);
 	} else {
@@ -429,6 +433,14 @@
 }
 
 void
+SceneGraph::set_move_collision(move_func new_move,
+			       collision_func new_collision)
+{
+    this->move = new_move;
+    this->collision = new_collision;
+}
+
+void
 SceneGraph::add_next(SceneGraphPtr next)
 {
     /* next のリストの最後に加える */
--- a/TaskManager/Test/test_render/SceneGraph.h	Sat Nov 29 01:18:32 2008 +0900
+++ b/TaskManager/Test/test_render/SceneGraph.h	Sat Nov 29 02:39:43 2008 +0900
@@ -55,6 +55,7 @@
     SceneGraph* searchSceneGraph(char *name);
     void set_move_collision(SceneGraph *node,
 			    move_func new_move, collision_func new_collision);
+    void set_move_collision(move_func new_move, collision_func new_collision);
 
 
     static void createFromXMLfile(char *);
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/TaskManager/Test/test_render/cube_action.cpp	Sat Nov 29 02:39:43 2008 +0900
@@ -0,0 +1,98 @@
+#include "SceneGraph.h"
+#include "xml_file/cube_split.h"
+
+static void cube_move_left(SceneGraphPtr node, int screen_w, int screen_h);
+static void cube_move_right(SceneGraphPtr node, int screen_w, int screen_h);
+static void cube_move_idle(SceneGraphPtr node, int screen_w, int screen_h);
+static void cube_collision(SceneGraphPtr node, int screen_w, int screen_h,
+			   SceneGraphPtr tree);
+
+static void cube_split(SceneGraphPtr root);
+
+static void
+cube_move_left(SceneGraphPtr node, int screen_w, int screen_h)
+{
+    node->xyz[0] -= node->stack_xyz[0];
+    node->xyz[1] -= node->stack_xyz[0] * node->stack_xyz[1];
+    node->xyz[2] -= node->stack_xyz[0] * node->stack_xyz[2];
+
+    node->angle[0] += 0.2;
+    node->angle[1] += 0.2 * node->stack_xyz[1];
+    node->angle[2] += 0.2 * node->stack_xyz[2];
+    
+    if (node->frame > 10 && scene_graph->controller->circle.push) {
+	cube_split(node);
+    }
+}
+
+static void
+cube_move_right(SceneGraphPtr node, int screen_w, int screen_h)
+{
+    node->xyz[0] += node->stack_xyz[0];
+    node->xyz[1] -= node->stack_xyz[0] * node->stack_xyz[1];
+    node->xyz[2] -= node->stack_xyz[0] * node->stack_xyz[2];
+
+    node->angle[0] += 0.2;
+    node->angle[1] += 0.2 * node->stack_xyz[1];
+    node->angle[2] += 0.2 * node->stack_xyz[2];
+
+    if (node->frame > 10 && scene_graph->controller->circle.push) {
+	cube_split(node);
+    }
+}
+
+static void
+cube_split(SceneGraphPtr root)
+{
+    SceneGraphPtr p = root->clone();
+    root->addBrother(p);
+
+    root->set_move_collision(cube_move_left, cube_collision);
+    p->set_move_collision(cube_move_right, cube_collision);
+
+    p->xyz[0] = root->xyz[0] + 2;
+    p->xyz[1] = root->xyz[1];
+    p->xyz[2] = root->xyz[2];
+
+    p->stack_xyz[0] = 0.2;
+    p->stack_xyz[1] = random()%3-1;
+    p->stack_xyz[2] = random()%3-1;
+
+    root->xyz[0] -= 2;
+    root->stack_xyz[0] = 0.2;
+    root->stack_xyz[1] = random()%3-1;
+    root->stack_xyz[2] = random()%3-1;
+}
+
+
+static void
+cube_move_idle(SceneGraphPtr node, int screen_w, int screen_h)
+{
+    node->xyz[0] = screen_w/2;
+    node->xyz[1] = screen_h/2;
+    node->xyz[2] = -300.0f;
+
+    if (scene_graph->controller->circle.push) {
+	cube_split(node);
+    }
+}
+
+static void
+cube_collision(SceneGraphPtr node, int screen_w, int screen_h,
+	       SceneGraphPtr tree)
+{
+}
+
+static void
+plane_idle(SceneGraphPtr node, int w, int h)
+{
+    node->xyz[2] = 100.0f;
+}
+
+void
+create_cube_split(void)
+{
+    SceneGraph::createFromXMLfile("xml_file/cube_split.xml");
+    Plane->set_move_collision(plane_idle, cube_collision);
+    CUBE->set_move_collision(cube_move_idle, cube_collision);
+}
--- a/TaskManager/Test/test_render/node.cpp	Sat Nov 29 01:18:32 2008 +0900
+++ b/TaskManager/Test/test_render/node.cpp	Sat Nov 29 02:39:43 2008 +0900
@@ -1,51 +1,7 @@
 #include <stdlib.h>
 #include "SceneGraph.h"
-#include "xml_file/universe.h"
 #include "xml_file/cube.h"
-#include "xml_file/snake576x384.h"
-
-static void
-earth_move(SceneGraphPtr node, int screen_w, int screen_h)
-{
-    static float dest_x = 0.3f;
-    static float dest_y = 0.5f;
-
-    node->angle[1] += 1.0f;
-    if (node->angle[1] > 360.0f) {
-	node->angle[1] = 0.0f;
-    }
-
-    node->xyz[0] += dest_x;
-    if ((int)node->xyz[0] > screen_w || (int)node->xyz[0] < 0) {
-	dest_x = -dest_x;
-    }
 
-    node->xyz[1] += dest_y;
-    if ((int)node->xyz[1] > screen_h || (int)node->xyz[1] < 0) {
-	dest_y = -dest_y;
-    }
-}
-
-static void
-moon_move(SceneGraphPtr node, int screen_w, int screen_h)
-{
-    node->angle[0] += 1.0f;
-    if (node->angle[1] > 360.0f) {
-	node->angle[1] = 0.0f;
-    }
-}
-
-static void
-earth_collision(SceneGraphPtr node, int screen_w, int screen_h,
-		SceneGraphPtr tree)
-{
-}
-
-static void
-moon_collision(SceneGraphPtr node, int screen_w, int screen_h,
-	       SceneGraphPtr tree)
-{
-}
 
 static void
 cube_collision(SceneGraphPtr node, int screen_w, int screen_h,
@@ -94,7 +50,7 @@
 	SceneGraphPtr p = node->clone();
 	p->position_init();
 	node->addBrother(p);
-	scene_graph->set_move_collision(p, cube_move2, cube_collision);
+	p->set_move_collision(cube_move2, cube_collision);
 	p->stack_xyz[0] = (float)(random() % 5);
 	p->stack_xyz[1] = (float)(random() % 5);
 	//p->xyz[0] = screen_w/2;
@@ -108,10 +64,7 @@
 void
 node_init(void)
 {
-#if 0
-    scene_graph->set_move_collision(Earth, earth_move, earth_collision);
-    scene_graph->set_move_collision(Moon, moon_move, moon_collision);
-#else
+#if 1
     scene_graph->set_move_collision(Cube, cube_move, cube_collision);
     Cube->stack_xyz[0] = 2.0f;
     Cube->stack_xyz[1] = 2.0f;
--- a/TaskManager/Test/test_render/task/CreateSpan.cpp	Sat Nov 29 01:18:32 2008 +0900
+++ b/TaskManager/Test/test_render/task/CreateSpan.cpp	Sat Nov 29 02:39:43 2008 +0900
@@ -68,9 +68,11 @@
 make_vMid10(VertexPack *v, VertexPack *vMin,
 	    VertexPack *vMid, VertexPack *vMax)
 {
-    int d, d1;
-
-    d  = (int)(vMax->y - vMin->y);
+    //int d, d1;
+    float d;
+    int d1;
+    
+    d  = vMax->y - vMin->y;
     d1 = (int)(vMid->y - vMin->y);
 
     v->tex_x  = calc(vMax->tex_x - vMin->tex_x, d, d1, vMin->tex_x);
@@ -88,52 +90,52 @@
 void
 CreateSpan::setTile(SpanPtr span)
 {
-    TileInfoListPtr tilelist = (TileInfoListPtr)smanager->allocate(sizeof(TileInfoList));
-    TileInfoListPtr send_tilelist = (TileInfoListPtr)smanager->allocate(sizeof(TileInfoList));;
+    TileInfoListPtr tilelist =
+	(TileInfoListPtr)smanager->allocate(sizeof(TileInfoList));
+    TileInfoListPtr send_tilelist =
+	(TileInfoListPtr)smanager->allocate(sizeof(TileInfoList));
     TileInfoListPtr tilelist_addr;
-    TileInfoListPtr tmp = NULL;
+    TileInfoListPtr send_tilelist_addr;
+    TileInfoPtr tile;
 
-    TileInfoPtr tile;
-    int remain = span->length_x; // 残りのドット(Tile)数
+    int cur_x = 0;
     int len = 0;
 
-    //smanager->mainMem_wait();
+    smanager->mainMem_wait();
     tilelist_addr = (TileInfoListPtr)smanager->mainMem_get(TILE_ALLOCATE);
     span->tilelist = tilelist_addr;
-    smanager->dma_load(tilelist, (uint32)tilelist_addr,
-		       sizeof(TileInfoList), TILE_LOAD);
 
-    uint32 hoge = (uint32)tilelist_addr;
-    
-    while (remain > 0) {
-	if (remain > MAX_TILE_LIST) {
-	    smanager->mainMem_alloc(TILE_ALLOCATE, sizeof(TileInfoList));
-	    len = MAX_TILE_LIST;
-	} else {
-	    len = remain;
-	}
+    float tex1 = span->tex_x1;
+    float tex2 = span->tex_x2;
+    float tey1 = span->tex_y1;
+    float tey2 = span->tex_y2;
+    int tex_xpos;
+    int tex_ypos;
+    int end = span->length_x;
 
-	float tex1 = span->tex_x1;
-	float tex2 = span->tex_x2;
-	float tey1 = span->tex_y1;
-	float tey2 = span->tex_y2;
-	int tex_xpos;
-	int tex_ypos;
+    if (span->length_x == 1) {
+	tilelist->init();
+	tile = &tilelist->tileinfo[tilelist->size++];
+
+	tex_xpos = (int)((span->tex_width-1) * tex1);
+	tex_ypos = (int)((span->tex_height-1) * tey1);
 
-	smanager->dma_wait(TILE_LOAD);
+	tile->tix = tex_xpos;
+	tile->tiy = tex_ypos;
+    } else {    
+	while (cur_x < span->length_x) {
+	    len = (cur_x + MAX_TILE_LIST < span->length_x) ?
+		MAX_TILE_LIST : span->length_x - cur_x;
 
-	if (len == 1) {
-	    tile = &tilelist->tileinfo[tilelist->size++];
-	    tex_xpos = (int)((span->tex_width-1) * tex1);
-	    tex_ypos = (int)((span->tex_height-1) * tey1);
-	} else {
 	    float tex_x, tex_y;
 
-	    for (int i = 0; i < len; i++) {
+	    tilelist->init();
+
+	    for (int i = cur_x; i < end; i++) {
 		tile = &tilelist->tileinfo[tilelist->size++];
 
-		tex_x = tex1*(len-1-i)/(len-1) + tex2*i/(len-1);
-		tex_y = tey1*(len-1-i)/(len-1) + tey2*i/(len-1);
+		tex_x = tex1*(end-1-i)/(end-1) + tex2*i/(end-1);
+		tex_y = tey1*(end-1-i)/(end-1) + tey2*i/(end-1);
 		if (tex_x > 1) tex_x = 1;
 		if (tex_y > 1) tex_y = 1;
 		tex_xpos = (int)((span->tex_height-1) * tex_x);
@@ -142,38 +144,39 @@
 		tile->tix = tex_xpos;
 		tile->tiy = tex_ypos;
 	    }
-	}
-
-	if (remain > MAX_TILE_LIST) {
-	    TileInfoListPtr send = tilelist_addr;
-
-	    tmp = tilelist;
-	    tilelist = send_tilelist;
-	    send_tilelist = tmp;
+	
+	    if (cur_x + MAX_TILE_LIST < span->length_x) {
+		TileInfoListPtr tmp = tilelist;
+		tilelist = send_tilelist;
+		send_tilelist = tmp;
+		send_tilelist_addr = tilelist_addr;
 
-	    smanager->mainMem_wait();
-	    tilelist_addr =
-		(TileInfoListPtr)smanager->mainMem_get(TILE_ALLOCATE);
-
-	    send_tilelist->next = tilelist_addr;
-
-	    smanager->dma_wait(TILE_STORE);
-	    smanager->dma_store(send_tilelist, (uint32)send,
-				sizeof(TileInfoList),TILE_STORE);
+		smanager->mainMem_alloc(TILE_ALLOCATE, sizeof(TileInfoList));
+		smanager->mainMem_wait();
+		tilelist_addr =
+		    (TileInfoListPtr)smanager->mainMem_get(TILE_ALLOCATE);
+		
+		send_tilelist->next = tilelist_addr;
+		
+		smanager->dma_wait(TILE_STORE);
+		smanager->dma_store(send_tilelist, (uint32)send_tilelist_addr,
+				    sizeof(TileInfoList), TILE_STORE);
+	    }
 	    
-	    smanager->dma_load(tilelist, (uint32)tilelist_addr,
-			       sizeof(TileInfoList), TILE_LOAD);    
+	    cur_x += MAX_TILE_LIST;
 	}
-	remain -= MAX_TILE_LIST;
     }
 
     smanager->dma_wait(TILE_STORE);
+    tilelist->next = 0; // ?
     smanager->dma_store(tilelist, (uint32)tilelist_addr,
 			sizeof(TileInfoList), TILE_STORE);
+
+    free(send_tilelist);
+
     smanager->dma_wait(TILE_STORE);
 
     free(tilelist);
-    free(send_tilelist);
 }
 
 /**
@@ -312,8 +315,10 @@
 
 	/**
 	 * メインメモリに、Tile 用の領域確保をここで指定しておく
-	 */ 
-	smanager->mainMem_alloc(TILE_ALLOCATE, sizeof(TileInfoList));
+	 */
+	// ちと仕様変更によりここでは使わない
+	// 予めやっておいて、その間に処理、だとちょっと動作が怪しいらしい
+	//smanager->mainMem_alloc(TILE_ALLOCATE, sizeof(TileInfoList));
 	
 	tmp_xpos = calc(vMid10->x - vMin->x ,div_y, i, vMin->x);
 	tmp_end  = calc(vMid->x  - vMin->x ,div_y, i, vMin->x);
@@ -375,8 +380,8 @@
 	// TilePtr の計算
 	// tix, tiy (Tile 内での x, y)
 	//
-	smanager->mainMem_wait();
-	setTile(span);
+	//smanager->mainMem_wait();
+	//setTile(span);
     }
 }
 
--- a/TaskManager/Test/test_render/viewer.cpp	Sat Nov 29 01:18:32 2008 +0900
+++ b/TaskManager/Test/test_render/viewer.cpp	Sat Nov 29 02:39:43 2008 +0900
@@ -105,6 +105,8 @@
 
 extern void node_init(void);
 
+extern void create_cube_split(void);
+
 void
 Viewer::run_init(char *xml)
 {
@@ -121,12 +123,14 @@
      * scene_graph にオリジナルの SceneGraph Object のリストが、
      * scene_graph_viewer に描画用の SceneGraph が生成される
      */
-    SceneGraph::createFromXMLfile(xml);
+    //SceneGraph::createFromXMLfile(xml);
     //polygon->viewer  = this;
 
+    create_cube_split();
+    //node_init();
+
     scene_graph->controller = create_controller();
 	
-    node_init();
 
     sgpack = (SceneGraphPack*)manager->malloc(sizeof(SceneGraphPack));
     sgpack->init();
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/TaskManager/Test/test_render/xml_file/cube_split.h	Sat Nov 29 02:39:43 2008 +0900
@@ -0,0 +1,2 @@
+#define Plane scene_graph
+#define CUBE scene_graph->next
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/TaskManager/Test/test_render/xml_file/cube_split.xml	Sat Nov 29 02:39:43 2008 +0900
@@ -0,0 +1,279 @@
+<?xml version="1.0"?>
+<OBJECT-3D>
+	<surface name="Plane" size="6" prim="Triangle" parent="NULL">
+		<coordinate>
+			38.655231 38.973322 -1.031601
+			-42.648190 38.973337 -1.031601
+			-42.648209 -42.330103 -1.031601
+			-42.648209 -42.330103 -1.031601
+			38.655231 -42.330107 -1.031601
+			38.655231 38.973322 -1.031601
+		</coordinate>
+		<normal>
+			0.000000 -0.000000 1.000000
+			0.000000 -0.000000 1.000000
+			0.000000 -0.000000 1.000000
+			0.000000 -0.000000 1.000000
+			0.000000 -0.000000 1.000000
+			0.000000 -0.000000 1.000000
+		</normal>
+		<model>
+			-1.996483 -1.678389 -1.031601
+		</model>
+		<texture>
+			0.000000 0.000000
+			1.000000 0.000000
+			1.000000 1.000000
+			1.000000 1.000000
+			0.000000 1.000000
+			0.000000 0.000000
+		</texture>
+		<image name="cubetex.png">
+			iVBORw0KGgoAAAANSUhEUgAAAQAAAAEACAIAAADTED8xAAAACXBIWXMAAAsTAAALEwEAmpwYAAAK
+			TWlDQ1BQaG90b3Nob3AgSUNDIHByb2ZpbGUAAHjanVN3WJP3Fj7f92UPVkLY8LGXbIEAIiOsCMgQ
+			WaIQkgBhhBASQMWFiApWFBURnEhVxILVCkidiOKgKLhnQYqIWotVXDjuH9yntX167+3t+9f7vOec
+			5/zOec8PgBESJpHmomoAOVKFPDrYH49PSMTJvYACFUjgBCAQ5svCZwXFAADwA3l4fnSwP/wBr28A
+			AgBw1S4kEsfh/4O6UCZXACCRAOAiEucLAZBSAMguVMgUAMgYALBTs2QKAJQAAGx5fEIiAKoNAOz0
+			ST4FANipk9wXANiiHKkIAI0BAJkoRyQCQLsAYFWBUiwCwMIAoKxAIi4EwK4BgFm2MkcCgL0FAHaO
+			WJAPQGAAgJlCLMwAIDgCAEMeE80DIEwDoDDSv+CpX3CFuEgBAMDLlc2XS9IzFLiV0Bp38vDg4iHi
+			wmyxQmEXKRBmCeQinJebIxNI5wNMzgwAABr50cH+OD+Q5+bk4eZm52zv9MWi/mvwbyI+IfHf/ryM
+			AgQAEE7P79pf5eXWA3DHAbB1v2upWwDaVgBo3/ldM9sJoFoK0Hr5i3k4/EAenqFQyDwdHAoLC+0l
+			YqG9MOOLPv8z4W/gi372/EAe/tt68ABxmkCZrcCjg/1xYW52rlKO58sEQjFu9+cj/seFf/2OKdHi
+			NLFcLBWK8ViJuFAiTcd5uVKRRCHJleIS6X8y8R+W/QmTdw0ArIZPwE62B7XLbMB+7gECiw5Y0nYA
+			QH7zLYwaC5EAEGc0Mnn3AACTv/mPQCsBAM2XpOMAALzoGFyolBdMxggAAESggSqwQQcMwRSswA6c
+			wR28wBcCYQZEQAwkwDwQQgbkgBwKoRiWQRlUwDrYBLWwAxqgEZrhELTBMTgN5+ASXIHrcBcGYBie
+			whi8hgkEQcgIE2EhOogRYo7YIs4IF5mOBCJhSDSSgKQg6YgUUSLFyHKkAqlCapFdSCPyLXIUOY1c
+			QPqQ28ggMor8irxHMZSBslED1AJ1QLmoHxqKxqBz0XQ0D12AlqJr0Rq0Hj2AtqKn0UvodXQAfYqO
+			Y4DRMQ5mjNlhXIyHRWCJWBomxxZj5Vg1Vo81Yx1YN3YVG8CeYe8IJAKLgBPsCF6EEMJsgpCQR1hM
+			WEOoJewjtBK6CFcJg4Qxwicik6hPtCV6EvnEeGI6sZBYRqwm7iEeIZ4lXicOE1+TSCQOyZLkTgoh
+			JZAySQtJa0jbSC2kU6Q+0hBpnEwm65Btyd7kCLKArCCXkbeQD5BPkvvJw+S3FDrFiOJMCaIkUqSU
+			Eko1ZT/lBKWfMkKZoKpRzame1AiqiDqfWkltoHZQL1OHqRM0dZolzZsWQ8ukLaPV0JppZ2n3aC/p
+			dLoJ3YMeRZfQl9Jr6Afp5+mD9HcMDYYNg8dIYigZaxl7GacYtxkvmUymBdOXmchUMNcyG5lnmA+Y
+			b1VYKvYqfBWRyhKVOpVWlX6V56pUVXNVP9V5qgtUq1UPq15WfaZGVbNQ46kJ1Bar1akdVbupNq7O
+			UndSj1DPUV+jvl/9gvpjDbKGhUaghkijVGO3xhmNIRbGMmXxWELWclYD6yxrmE1iW7L57Ex2Bfsb
+			di97TFNDc6pmrGaRZp3mcc0BDsax4PA52ZxKziHODc57LQMtPy2x1mqtZq1+rTfaetq+2mLtcu0W
+			7eva73VwnUCdLJ31Om0693UJuja6UbqFutt1z+o+02PreekJ9cr1Dund0Uf1bfSj9Rfq79bv0R83
+			MDQINpAZbDE4Y/DMkGPoa5hpuNHwhOGoEctoupHEaKPRSaMnuCbuh2fjNXgXPmasbxxirDTeZdxr
+			PGFiaTLbpMSkxeS+Kc2Ua5pmutG003TMzMgs3KzYrMnsjjnVnGueYb7ZvNv8jYWlRZzFSos2i8eW
+			2pZ8ywWWTZb3rJhWPlZ5VvVW16xJ1lzrLOtt1ldsUBtXmwybOpvLtqitm63Edptt3xTiFI8p0in1
+			U27aMez87ArsmuwG7Tn2YfYl9m32zx3MHBId1jt0O3xydHXMdmxwvOuk4TTDqcSpw+lXZxtnoXOd
+			8zUXpkuQyxKXdpcXU22niqdun3rLleUa7rrStdP1o5u7m9yt2W3U3cw9xX2r+00umxvJXcM970H0
+			8PdY4nHM452nm6fC85DnL152Xlle+70eT7OcJp7WMG3I28Rb4L3Le2A6Pj1l+s7pAz7GPgKfep+H
+			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
+			rkJggg==
+		</image>
+	</surface>
+	<surface name="CUBE" size="36" prim="Triangle" parent="Plane">
+		<coordinate>
+			1.789587 1.361652 11.458147
+			1.789587 -1.898860 11.458147
+			-1.470925 -1.898860 11.458147
+			-1.470925 -1.898860 11.458147
+			-1.470925 1.361653 11.458147
+			1.789587 1.361652 11.458147
+			1.789588 1.361652 14.718660
+			-1.470925 1.361652 14.718660
+			-1.470926 -1.898860 14.718660
+			-1.470926 -1.898860 14.718660
+			1.789587 -1.898861 14.718660
+			1.789588 1.361652 14.718660
+			1.789587 1.361652 11.458147
+			1.789588 1.361652 14.718660
+			1.789587 -1.898861 14.718660
+			1.789587 -1.898861 14.718660
+			1.789587 -1.898860 11.458147
+			1.789587 1.361652 11.458147
+			1.789587 -1.898860 11.458147
+			1.789587 -1.898861 14.718660
+			-1.470926 -1.898860 14.718660
+			-1.470926 -1.898860 14.718660
+			-1.470925 -1.898860 11.458147
+			1.789587 -1.898860 11.458147
+			-1.470925 -1.898860 11.458147
+			-1.470926 -1.898860 14.718660
+			-1.470925 1.361652 14.718660
+			-1.470925 1.361652 14.718660
+			-1.470925 1.361653 11.458147
+			-1.470925 -1.898860 11.458147
+			1.789588 1.361652 14.718660
+			1.789587 1.361652 11.458147
+			-1.470925 1.361653 11.458147
+			-1.470925 1.361653 11.458147
+			-1.470925 1.361652 14.718660
+			1.789588 1.361652 14.718660
+		</coordinate>
+		<normal>
+			0.000000 0.000000 -1.000000
+			0.000000 0.000000 -1.000000
+			0.000000 0.000000 -1.000000
+			0.000000 0.000000 -1.000000
+			0.000000 0.000000 -1.000000
+			0.000000 0.000000 -1.000000
+			0.000000 -0.000000 1.000000
+			0.000000 -0.000000 1.000000
+			0.000000 -0.000000 1.000000
+			0.000000 -0.000000 1.000000
+			0.000000 -0.000000 1.000000
+			0.000000 -0.000000 1.000000
+			1.000000 -0.000000 0.000000
+			1.000000 -0.000000 0.000000
+			1.000000 -0.000000 0.000000
+			1.000000 -0.000000 0.000000
+			1.000000 -0.000000 0.000000
+			1.000000 -0.000000 0.000000
+			-0.000000 -1.000000 -0.000000
+			-0.000000 -1.000000 -0.000000
+			-0.000000 -1.000000 -0.000000
+			-0.000000 -1.000000 -0.000000
+			-0.000000 -1.000000 -0.000000
+			-0.000000 -1.000000 -0.000000
+			-1.000000 0.000000 -0.000000
+			-1.000000 0.000000 -0.000000
+			-1.000000 0.000000 -0.000000
+			-1.000000 0.000000 -0.000000
+			-1.000000 0.000000 -0.000000
+			-1.000000 0.000000 -0.000000
+			0.000000 1.000000 0.000000
+			0.000000 1.000000 0.000000
+			0.000000 1.000000 0.000000
+			0.000000 1.000000 0.000000
+			0.000000 1.000000 0.000000
+			0.000000 1.000000 0.000000
+		</normal>
+		<model>
+			0.159331 -0.268604 13.088404
+		</model>
+		<texture>
+			0.000000 0.000000
+			1.000000 0.000000
+			1.000000 1.000000
+			1.000000 1.000000
+			0.000000 1.000000
+			0.000000 0.000000
+			0.000000 0.000000
+			1.000000 0.000000
+			1.000000 1.000000
+			1.000000 1.000000
+			0.000000 1.000000
+			0.000000 0.000000
+			0.000000 0.000000
+			1.000000 0.000000
+			1.000000 1.000000
+			1.000000 1.000000
+			0.000000 1.000000
+			0.000000 0.000000
+			0.000000 0.000000
+			1.000000 0.000000
+			1.000000 1.000000
+			1.000000 1.000000
+			0.000000 1.000000
+			0.000000 0.000000
+			0.000000 0.000000
+			1.000000 0.000000
+			1.000000 1.000000
+			1.000000 1.000000
+			0.000000 1.000000
+			0.000000 0.000000
+			0.000000 0.000000
+			1.000000 0.000000
+			1.000000 1.000000
+			1.000000 1.000000
+			0.000000 1.000000
+			0.000000 0.000000
+		</texture>
+		<image name="cubetex.png">
+			iVBORw0KGgoAAAANSUhEUgAAAQAAAAEACAIAAADTED8xAAAACXBIWXMAAAsTAAALEwEAmpwYAAAK
+			TWlDQ1BQaG90b3Nob3AgSUNDIHByb2ZpbGUAAHjanVN3WJP3Fj7f92UPVkLY8LGXbIEAIiOsCMgQ
+			WaIQkgBhhBASQMWFiApWFBURnEhVxILVCkidiOKgKLhnQYqIWotVXDjuH9yntX167+3t+9f7vOec
+			5/zOec8PgBESJpHmomoAOVKFPDrYH49PSMTJvYACFUjgBCAQ5svCZwXFAADwA3l4fnSwP/wBr28A
+			AgBw1S4kEsfh/4O6UCZXACCRAOAiEucLAZBSAMguVMgUAMgYALBTs2QKAJQAAGx5fEIiAKoNAOz0
+			ST4FANipk9wXANiiHKkIAI0BAJkoRyQCQLsAYFWBUiwCwMIAoKxAIi4EwK4BgFm2MkcCgL0FAHaO
+			WJAPQGAAgJlCLMwAIDgCAEMeE80DIEwDoDDSv+CpX3CFuEgBAMDLlc2XS9IzFLiV0Bp38vDg4iHi
+			wmyxQmEXKRBmCeQinJebIxNI5wNMzgwAABr50cH+OD+Q5+bk4eZm52zv9MWi/mvwbyI+IfHf/ryM
+			AgQAEE7P79pf5eXWA3DHAbB1v2upWwDaVgBo3/ldM9sJoFoK0Hr5i3k4/EAenqFQyDwdHAoLC+0l
+			YqG9MOOLPv8z4W/gi372/EAe/tt68ABxmkCZrcCjg/1xYW52rlKO58sEQjFu9+cj/seFf/2OKdHi
+			NLFcLBWK8ViJuFAiTcd5uVKRRCHJleIS6X8y8R+W/QmTdw0ArIZPwE62B7XLbMB+7gECiw5Y0nYA
+			QH7zLYwaC5EAEGc0Mnn3AACTv/mPQCsBAM2XpOMAALzoGFyolBdMxggAAESggSqwQQcMwRSswA6c
+			wR28wBcCYQZEQAwkwDwQQgbkgBwKoRiWQRlUwDrYBLWwAxqgEZrhELTBMTgN5+ASXIHrcBcGYBie
+			whi8hgkEQcgIE2EhOogRYo7YIs4IF5mOBCJhSDSSgKQg6YgUUSLFyHKkAqlCapFdSCPyLXIUOY1c
+			QPqQ28ggMor8irxHMZSBslED1AJ1QLmoHxqKxqBz0XQ0D12AlqJr0Rq0Hj2AtqKn0UvodXQAfYqO
+			Y4DRMQ5mjNlhXIyHRWCJWBomxxZj5Vg1Vo81Yx1YN3YVG8CeYe8IJAKLgBPsCF6EEMJsgpCQR1hM
+			WEOoJewjtBK6CFcJg4Qxwicik6hPtCV6EvnEeGI6sZBYRqwm7iEeIZ4lXicOE1+TSCQOyZLkTgoh
+			JZAySQtJa0jbSC2kU6Q+0hBpnEwm65Btyd7kCLKArCCXkbeQD5BPkvvJw+S3FDrFiOJMCaIkUqSU
+			Eko1ZT/lBKWfMkKZoKpRzame1AiqiDqfWkltoHZQL1OHqRM0dZolzZsWQ8ukLaPV0JppZ2n3aC/p
+			dLoJ3YMeRZfQl9Jr6Afp5+mD9HcMDYYNg8dIYigZaxl7GacYtxkvmUymBdOXmchUMNcyG5lnmA+Y
+			b1VYKvYqfBWRyhKVOpVWlX6V56pUVXNVP9V5qgtUq1UPq15WfaZGVbNQ46kJ1Bar1akdVbupNq7O
+			UndSj1DPUV+jvl/9gvpjDbKGhUaghkijVGO3xhmNIRbGMmXxWELWclYD6yxrmE1iW7L57Ex2Bfsb
+			di97TFNDc6pmrGaRZp3mcc0BDsax4PA52ZxKziHODc57LQMtPy2x1mqtZq1+rTfaetq+2mLtcu0W
+			7eva73VwnUCdLJ31Om0693UJuja6UbqFutt1z+o+02PreekJ9cr1Dund0Uf1bfSj9Rfq79bv0R83
+			MDQINpAZbDE4Y/DMkGPoa5hpuNHwhOGoEctoupHEaKPRSaMnuCbuh2fjNXgXPmasbxxirDTeZdxr
+			PGFiaTLbpMSkxeS+Kc2Ua5pmutG003TMzMgs3KzYrMnsjjnVnGueYb7ZvNv8jYWlRZzFSos2i8eW
+			2pZ8ywWWTZb3rJhWPlZ5VvVW16xJ1lzrLOtt1ldsUBtXmwybOpvLtqitm63Edptt3xTiFI8p0in1
+			U27aMez87ArsmuwG7Tn2YfYl9m32zx3MHBId1jt0O3xydHXMdmxwvOuk4TTDqcSpw+lXZxtnoXOd
+			8zUXpkuQyxKXdpcXU22niqdun3rLleUa7rrStdP1o5u7m9yt2W3U3cw9xX2r+00umxvJXcM970H0
+			8PdY4nHM452nm6fC85DnL152Xlle+70eT7OcJp7WMG3I28Rb4L3Le2A6Pj1l+s7pAz7GPgKfep+H
+			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
+			rkJggg==
+		</image>
+	</surface>
+</OBJECT-3D>
\ No newline at end of file