diff options
Diffstat (limited to '')
-rwxr-xr-x | src/extantz/build.lua | 2 | ||||
-rw-r--r-- | src/extantz/extantz.c | 58 | ||||
-rw-r--r-- | src/extantz/extantz.h | 14 | ||||
-rw-r--r-- | src/extantz/scenri.c | 213 |
4 files changed, 251 insertions, 36 deletions
diff --git a/src/extantz/build.lua b/src/extantz/build.lua index c2990ff..703b577 100755 --- a/src/extantz/build.lua +++ b/src/extantz/build.lua | |||
@@ -24,4 +24,4 @@ runCommand('Irrlicht files', dir, 'g++ ' .. CFLAGS .. ' -ffast-math -c crappissp | |||
24 | runCommand(nil, dir, 'g++ ' .. CFLAGS .. ' -ffast-math -c CDemo.cpp -o CDemo.o ' .. LDFLAGS) | 24 | runCommand(nil, dir, 'g++ ' .. CFLAGS .. ' -ffast-math -c CDemo.cpp -o CDemo.o ' .. LDFLAGS) |
25 | runCommand(nil, dir, 'g++ ' .. CFLAGS .. ' -ffast-math -c extantzCamera.cpp -o extantzCamera.o ' .. LDFLAGS) | 25 | runCommand(nil, dir, 'g++ ' .. CFLAGS .. ' -ffast-math -c extantzCamera.cpp -o extantzCamera.o ' .. LDFLAGS) |
26 | CFLAGS = CFLAGS .. ' -Wl,-export-dynamic' | 26 | CFLAGS = CFLAGS .. ' -Wl,-export-dynamic' |
27 | compileFiles('../../extantz', dir, {'gears', 'ephysics_demo', 'camera', 'Evas_3D_demo', 'files', 'scenri', 'woMan', 'extantz'}, 'crappisspuke.o CDemo.o extantzCamera.o') | 27 | compileFiles('../../extantz', dir, {'gears', 'ephysics_demo', 'camera', 'files', 'scenri', 'woMan', 'extantz'}, 'crappisspuke.o CDemo.o extantzCamera.o') |
diff --git a/src/extantz/extantz.c b/src/extantz/extantz.c index 835429f..e102165 100644 --- a/src/extantz/extantz.c +++ b/src/extantz/extantz.c | |||
@@ -11,7 +11,7 @@ static void on_pixels(void *data, Evas_Object *obj); | |||
11 | int logDom = -1; // Our logging domain. | 11 | int logDom = -1; // Our logging domain. |
12 | globals ourGlobals; | 12 | globals ourGlobals; |
13 | static Eina_Strbuf *serverStream; | 13 | static Eina_Strbuf *serverStream; |
14 | static char *myKey = "12345678-1234-4321-abcd-0123456789ab"; | 14 | //static char *myKey = "12345678-1234-4321-abcd-0123456789ab"; |
15 | //static char *myName = "onefang rejected"; | 15 | //static char *myName = "onefang rejected"; |
16 | 16 | ||
17 | 17 | ||
@@ -22,20 +22,11 @@ static Eina_Bool _add(void *data, int type, Ecore_Con_Event_Server_Add *ev) | |||
22 | 22 | ||
23 | PI("Connected to love server."); | 23 | PI("Connected to love server."); |
24 | ourGlobals->server = ev->server; | 24 | ourGlobals->server = ev->server; |
25 | |||
26 | // Pretend we logged in. | ||
27 | strcpy(ourGlobals->uuid, myKey); | ||
28 | |||
29 | if (ourGlobals->LSLGuiMess) ourGlobals->LSLGuiMess->server = ourGlobals->server; | 25 | if (ourGlobals->LSLGuiMess) ourGlobals->LSLGuiMess->server = ourGlobals->server; |
30 | if (ourGlobals->purkle) ourGlobals->purkle->server = ourGlobals->server; | 26 | if (ourGlobals->purkle) ourGlobals->purkle->server = ourGlobals->server; |
31 | 27 | ||
32 | Evas_3D_Demo_add(ourGlobals); | 28 | // TODO - If this is not a local love server, we should attempt to log in here. |
33 | // TODO - Just a temporary hack so Irrlicht and Evas_3D can share the camera move. | 29 | // Or attempt a hypergrid style TP. |
34 | ourGlobals->gld.move = ourGlobals->scene->move; | ||
35 | evas_object_data_set(elm_image_object_get(ourGlobals->scene->image), "glob", ourGlobals); | ||
36 | evas_object_image_pixels_get_callback_set(elm_image_object_get(ourGlobals->scene->image), on_pixels, ourGlobals); | ||
37 | // Setup our callback for clicking in world. | ||
38 | ourGlobals->scene->clickCb = _onWorldClick; | ||
39 | 30 | ||
40 | return ECORE_CALLBACK_RENEW; | 31 | return ECORE_CALLBACK_RENEW; |
41 | } | 32 | } |
@@ -96,6 +87,40 @@ static Eina_Bool _data(void *data, int type, Ecore_Con_Event_Server_Data *ev) | |||
96 | PE("No LSLGuiMess to send - %s", command); | 87 | PE("No LSLGuiMess to send - %s", command); |
97 | 88 | ||
98 | } | 89 | } |
90 | else if (0 == strncmp(command, "loadSim(", 8)) | ||
91 | { | ||
92 | char *p, *t; | ||
93 | int scenriLua; | ||
94 | |||
95 | // Pretend we logged in. Actually in the case of a local love server, we realy have logged in now. | ||
96 | strcpy(ourGlobals->uuid, SID); | ||
97 | PI("Your UUID is %s.", ourGlobals->uuid); | ||
98 | strcpy(buf, &command[8]); | ||
99 | p = buf; | ||
100 | while ('"' == p[0]) | ||
101 | p++; | ||
102 | while ('\'' == p[0]) | ||
103 | p++; | ||
104 | t = p; | ||
105 | while (('"' != p[0]) && ('\'' != p[0])) | ||
106 | p++; | ||
107 | p[0] = '\0'; | ||
108 | // TODO - For now, assume it's a file:// URL. | ||
109 | t += 7; | ||
110 | //strcat(t, "/index.omg"); | ||
111 | PI("Loading local sim from %s", t); | ||
112 | |||
113 | // TODO - Later do the same with eet files in C code, but keep both implementations. | ||
114 | lua_getglobal(ourGlobals->scene->L, "package"); | ||
115 | lua_getfield(ourGlobals->scene->L, lua_gettop(ourGlobals->scene->L), "loaded"); | ||
116 | lua_remove(ourGlobals->scene->L, -2); // Removes "package" | ||
117 | lua_getfield(ourGlobals->scene->L, lua_gettop(ourGlobals->scene->L), "scenriLua"); | ||
118 | lua_remove(ourGlobals->scene->L, -2); // Removes "loaded" | ||
119 | scenriLua = lua_gettop(ourGlobals->scene->L); | ||
120 | |||
121 | push_lua(ourGlobals->scene->L, "@ ( $ $ )", scenriLua, "loadSim", t); | ||
122 | // Evas_3D_Demo_add(ourGlobals, t); | ||
123 | } | ||
99 | else | 124 | else |
100 | { | 125 | { |
101 | PI("Some random command %s", command); | 126 | PI("Some random command %s", command); |
@@ -587,7 +612,6 @@ EAPI_MAIN int elm_main(int argc, char **argv) | |||
587 | if (!ephysics_init()) | 612 | if (!ephysics_init()) |
588 | return 1; | 613 | return 1; |
589 | 614 | ||
590 | eina_clist_init(&(ourGlobals.stuffs)); | ||
591 | gld = &ourGlobals.gld; | 615 | gld = &ourGlobals.gld; |
592 | gldata_init(gld); | 616 | gldata_init(gld); |
593 | 617 | ||
@@ -662,6 +686,14 @@ EAPI_MAIN int elm_main(int argc, char **argv) | |||
662 | 686 | ||
663 | init_evas_gl(&ourGlobals); | 687 | init_evas_gl(&ourGlobals); |
664 | 688 | ||
689 | // Setup our Evas_3D stuff. | ||
690 | ourGlobals.scene = scenriAdd(ourGlobals.win); | ||
691 | // TODO - Just a temporary hack so Irrlicht and Evas_3D can share the camera move. | ||
692 | ourGlobals.gld.move = ourGlobals.scene->move; | ||
693 | evas_object_data_set(elm_image_object_get(ourGlobals.scene->image), "glob", &ourGlobals); | ||
694 | evas_object_image_pixels_get_callback_set(elm_image_object_get(ourGlobals.scene->image), on_pixels, &ourGlobals); | ||
695 | ourGlobals.scene->clickCb = _onWorldClick; | ||
696 | |||
665 | // Gotta do this after adding the windows, otherwise the menu renders under the window. | 697 | // Gotta do this after adding the windows, otherwise the menu renders under the window. |
666 | // This sucks, gotta redefine this menu each time we create a new window? | 698 | // This sucks, gotta redefine this menu each time we create a new window? |
667 | // Also, GL focus gets lost when any menu is used. sigh | 699 | // Also, GL focus gets lost when any menu is used. sigh |
diff --git a/src/extantz/extantz.h b/src/extantz/extantz.h index 5095556..1526626 100644 --- a/src/extantz/extantz.h +++ b/src/extantz/extantz.h | |||
@@ -132,6 +132,7 @@ typedef struct | |||
132 | 132 | ||
133 | typedef struct _Scene_Data | 133 | typedef struct _Scene_Data |
134 | { | 134 | { |
135 | Evas *evas; | ||
135 | Evas_Object *image; // Our Elm image. | 136 | Evas_Object *image; // Our Elm image. |
136 | Evas_3D_Scene *scene; | 137 | Evas_3D_Scene *scene; |
137 | Evas_3D_Node *root_node; | 138 | Evas_3D_Node *root_node; |
@@ -140,6 +141,8 @@ typedef struct _Scene_Data | |||
140 | 141 | ||
141 | Evas_3D_Light *light; | 142 | Evas_3D_Light *light; |
142 | 143 | ||
144 | Eina_Clist stuffs; | ||
145 | /* | ||
143 | Evas_3D_Mesh *mesh; | 146 | Evas_3D_Mesh *mesh; |
144 | Evas_3D_Node *mesh_node; | 147 | Evas_3D_Node *mesh_node; |
145 | Evas_3D_Material *material0; | 148 | Evas_3D_Material *material0; |
@@ -157,10 +160,11 @@ typedef struct _Scene_Data | |||
157 | Evas_3D_Node *mesh3_node; | 160 | Evas_3D_Node *mesh3_node; |
158 | Evas_3D_Material *material3; | 161 | Evas_3D_Material *material3; |
159 | Evas_3D_Texture *texture_diffuse; | 162 | Evas_3D_Texture *texture_diffuse; |
160 | 163 | */ | |
161 | cameraMove *move; | 164 | cameraMove *move; |
162 | 165 | ||
163 | Evas_Object_Event_Cb clickCb; | 166 | Evas_Object_Event_Cb clickCb; |
167 | lua_State *L; | ||
164 | } Scene_Data; | 168 | } Scene_Data; |
165 | 169 | ||
166 | typedef void (* aniStuffs)(void *stuffs); | 170 | typedef void (* aniStuffs)(void *stuffs); |
@@ -168,6 +172,7 @@ typedef void (* aniStuffs)(void *stuffs); | |||
168 | typedef struct _extantzStuffs | 172 | typedef struct _extantzStuffs |
169 | { | 173 | { |
170 | Stuffs stuffs; | 174 | Stuffs stuffs; |
175 | Scene_Data *scene; | ||
171 | Evas_3D_Node *mesh_node; // Multiple Evas_3D_Mesh's can be in one Evas_3D_Node | 176 | Evas_3D_Node *mesh_node; // Multiple Evas_3D_Mesh's can be in one Evas_3D_Node |
172 | // Can't use in arrays here, can't find the element sizes of incomplete types. | 177 | // Can't use in arrays here, can't find the element sizes of incomplete types. |
173 | Eina_Array *mesh; // Evas_3D_Mesh | 178 | Eina_Array *mesh; // Evas_3D_Mesh |
@@ -245,7 +250,6 @@ typedef struct _globals | |||
245 | 250 | ||
246 | GLData gld; | 251 | GLData gld; |
247 | Scene_Data *scene; | 252 | Scene_Data *scene; |
248 | Eina_Clist stuffs; | ||
249 | 253 | ||
250 | EPhysics_World *world; | 254 | EPhysics_World *world; |
251 | 255 | ||
@@ -278,7 +282,7 @@ EAPI void finishIrr(globals *ourGlobals); | |||
278 | 282 | ||
279 | void overlay_add(globals *ourGlobals); | 283 | void overlay_add(globals *ourGlobals); |
280 | 284 | ||
281 | EAPI void Evas_3D_Demo_add(globals *ourGlobals); | 285 | EAPI void Evas_3D_Demo_add(globals *ourGlobals, char *file); |
282 | Eina_Bool animateScene(globals *ourGlobals); | 286 | Eina_Bool animateScene(globals *ourGlobals); |
283 | void Evas_3D_Demo_fini(globals *ourGlobals); | 287 | void Evas_3D_Demo_fini(globals *ourGlobals); |
284 | 288 | ||
@@ -287,9 +291,9 @@ Evas_3D_Node *cameraAdd(Evas *evas, Scene_Data *scene, Evas_Object *win); | |||
287 | Eina_Bool animateCamera(Scene_Data *scene); | 291 | Eina_Bool animateCamera(Scene_Data *scene); |
288 | Eina_Bool animateScene(globals *ourGlobals); | 292 | Eina_Bool animateScene(globals *ourGlobals); |
289 | void scenriDel(Scene_Data *scene); | 293 | void scenriDel(Scene_Data *scene); |
290 | void stuffsSetup(ExtantzStuffs *stuffs, globals *ourGlobals, Scene_Data *scene, int fake); | 294 | void stuffsSetup(ExtantzStuffs *stuffs, Scene_Data *scene, int fake); |
291 | ExtantzStuffs *addStuffs(char *uuid, char *name, char *description, char *owner, | 295 | ExtantzStuffs *addStuffs(char *uuid, char *name, char *description, char *owner, |
292 | char *file, MeshType type, float px, float py, float pz, float rx, float ry, float rz, float rw); | 296 | char *file, MeshType type, double px, double py, double pz, double rx, double ry, double rz, double rw); |
293 | void addMaterial(ExtantzStuffs *e, int face, TextureType type, char *file); | 297 | void addMaterial(ExtantzStuffs *e, int face, TextureType type, char *file); |
294 | 298 | ||
295 | winFang *filesAdd(globals *ourGlobals, char *path, Eina_Bool multi, Eina_Bool save); | 299 | winFang *filesAdd(globals *ourGlobals, char *path, Eina_Bool multi, Eina_Bool save); |
diff --git a/src/extantz/scenri.c b/src/extantz/scenri.c index 4ebc64a..e7d30c4 100644 --- a/src/extantz/scenri.c +++ b/src/extantz/scenri.c | |||
@@ -1,11 +1,85 @@ | |||
1 | // scenri.c, deals with the in world scenery. | ||
2 | |||
3 | /* TODO - I can see this growing to be very big, so should start to split it up at some point. | ||
4 | Base stuff - | ||
5 | scenriAdd/Del() | ||
6 | mouse hover showing tooltips | ||
7 | mouse click on objects | ||
8 | world animator that calls animators for stuffs | ||
9 | addStuffs/Materials() setupStuffs() | ||
10 | |||
11 | Scripting hooks | ||
12 | Lua hooks | ||
13 | LSL wrappers around Lua hooks | ||
14 | Lua file loader, maybe have this in libg3d? | ||
15 | |||
16 | Basic mesh stuff (likely just libg3d) - | ||
17 | create cube, sphere, etc | ||
18 | load meshes | ||
19 | |||
20 | In world editing | ||
21 | |||
22 | */ | ||
23 | |||
1 | #include "extantz.h" | 24 | #include "extantz.h" |
2 | 25 | ||
3 | 26 | ||
27 | #define SKANG "skang" | ||
28 | #define THINGASM "thingasm" | ||
29 | |||
30 | |||
31 | |||
32 | static void _animateCube(ExtantzStuffs *stuffs) | ||
33 | { | ||
34 | static float angle = 0.0f; | ||
35 | static int frame = 0; | ||
36 | static int inc = 1; | ||
37 | Evas_3D_Mesh *m; | ||
38 | |||
39 | eina_accessor_data_get(stuffs->aMesh, 0, (void **) &m); | ||
40 | |||
41 | angle += 0.5; | ||
42 | if (angle > 360.0) angle -= 360.0f; | ||
43 | |||
44 | frame += inc; | ||
45 | if (frame >= 20) inc = -1; | ||
46 | else if (frame <= 0) inc = 1; | ||
47 | |||
48 | eo_do(stuffs->mesh_node, | ||
49 | evas_3d_node_orientation_angle_axis_set(angle, 1.0, 1.0, 1.0), | ||
50 | evas_3d_node_mesh_frame_set(m, frame) | ||
51 | ); | ||
52 | } | ||
53 | |||
54 | static void _animateSphere(ExtantzStuffs *stuffs) | ||
55 | { | ||
56 | static float earthAngle = 0.0f; | ||
57 | |||
58 | earthAngle += 0.3; | ||
59 | if (earthAngle > 360.0) earthAngle -= 360.0f; | ||
60 | eo_do(stuffs->mesh_node, | ||
61 | evas_3d_node_orientation_angle_axis_set(earthAngle, 0.0, 1.0, 0.0) | ||
62 | ); | ||
63 | } | ||
64 | |||
65 | static void _animateSonic(ExtantzStuffs *stuffs) | ||
66 | { | ||
67 | static int sonicFrame = 0; | ||
68 | Evas_3D_Mesh *m; | ||
69 | |||
70 | eina_accessor_data_get(stuffs->aMesh, 0, (void **) &m); | ||
71 | sonicFrame += 32; | ||
72 | if (sonicFrame > 256 * 50) sonicFrame = 0; | ||
73 | eo_do(stuffs->mesh_node, | ||
74 | evas_3d_node_mesh_frame_set(m, sonicFrame) | ||
75 | ); | ||
76 | } | ||
77 | |||
4 | Eina_Bool animateScene(globals *ourGlobals) | 78 | Eina_Bool animateScene(globals *ourGlobals) |
5 | { | 79 | { |
6 | ExtantzStuffs *e; | 80 | ExtantzStuffs *e; |
7 | 81 | ||
8 | EINA_CLIST_FOR_EACH_ENTRY(e, &ourGlobals->stuffs, ExtantzStuffs, node) | 82 | EINA_CLIST_FOR_EACH_ENTRY(e, &ourGlobals->scene->stuffs, ExtantzStuffs, node) |
9 | { | 83 | { |
10 | if (e->animateStuffs) e->animateStuffs(e); | 84 | if (e->animateStuffs) e->animateStuffs(e); |
11 | } | 85 | } |
@@ -99,6 +173,52 @@ static void _on_mouse_down(void *data, Evas *e EINA_UNUSED, Evas_Object *o, void | |||
99 | 173 | ||
100 | } | 174 | } |
101 | 175 | ||
176 | static int _addStuffsL(lua_State *L) | ||
177 | { | ||
178 | ExtantzStuffs *result = NULL; | ||
179 | char *uuid, *name, *description, *owner, *file; | ||
180 | int type; | ||
181 | double px, py, pz, rx, ry, rz, rw; | ||
182 | |||
183 | pull_lua(L, 1, "$ $ $ $ $ % # # # # # # #", &uuid, &name, &description, &owner, &file, &type, &px, &py, &pz, &rx, &ry, &rz, &rw); | ||
184 | result = addStuffs(uuid, name, description, owner, file, type, px, py, pz, rx, ry, rz, rw); | ||
185 | if (result) | ||
186 | { | ||
187 | lua_getfield(L, LUA_REGISTRYINDEX, "sceneData"); | ||
188 | result->scene = (Scene_Data *) lua_touserdata(L, -1); | ||
189 | |||
190 | lua_pushlightuserdata(L, (void *) result); | ||
191 | return 1; | ||
192 | } | ||
193 | |||
194 | return 0; | ||
195 | } | ||
196 | |||
197 | static int _addMaterialL(lua_State *L) | ||
198 | { | ||
199 | ExtantzStuffs *e = NULL; | ||
200 | int face, type; | ||
201 | char *file; | ||
202 | |||
203 | pull_lua(L, 1, "* % % $", &e, &face, &type, &file); | ||
204 | if (e) | ||
205 | addMaterial(e, face, type, file); | ||
206 | |||
207 | return 0; | ||
208 | } | ||
209 | |||
210 | static int _stuffsSetupL(lua_State *L) | ||
211 | { | ||
212 | ExtantzStuffs *e = NULL; | ||
213 | int fake; | ||
214 | |||
215 | pull_lua(L, 1, "* %", &e, &fake); | ||
216 | if (e) | ||
217 | stuffsSetup(e, e->scene, fake); | ||
218 | |||
219 | return 0; | ||
220 | } | ||
221 | |||
102 | Scene_Data *scenriAdd(Evas_Object *win) | 222 | Scene_Data *scenriAdd(Evas_Object *win) |
103 | { | 223 | { |
104 | Scene_Data *scene; | 224 | Scene_Data *scene; |
@@ -108,6 +228,8 @@ Scene_Data *scenriAdd(Evas_Object *win) | |||
108 | evas = evas_object_evas_get(win); | 228 | evas = evas_object_evas_get(win); |
109 | eo_do(win, evas_obj_size_get(&w, &h)); | 229 | eo_do(win, evas_obj_size_get(&w, &h)); |
110 | scene = calloc(1, sizeof(Scene_Data)); | 230 | scene = calloc(1, sizeof(Scene_Data)); |
231 | scene->evas = evas; | ||
232 | eina_clist_init(&(scene->stuffs)); | ||
111 | 233 | ||
112 | scene->root_node = eo_add_custom(EVAS_3D_NODE_CLASS, evas, evas_3d_node_constructor(EVAS_3D_NODE_TYPE_NODE)); | 234 | scene->root_node = eo_add_custom(EVAS_3D_NODE_CLASS, evas, evas_3d_node_constructor(EVAS_3D_NODE_TYPE_NODE)); |
113 | 235 | ||
@@ -152,11 +274,61 @@ Scene_Data *scenriAdd(Evas_Object *win) | |||
152 | 274 | ||
153 | elm_win_resize_object_add(win, scene->image); | 275 | elm_win_resize_object_add(win, scene->image); |
154 | 276 | ||
277 | scene->L = luaL_newstate(); | ||
278 | if (scene->L) | ||
279 | { | ||
280 | char buf[PATH_MAX]; | ||
281 | int skang, scenriLua; | ||
282 | |||
283 | luaL_openlibs(scene->L); | ||
284 | lua_getglobal(scene->L, "require"); | ||
285 | lua_pushstring(scene->L, "scenriLua"); | ||
286 | lua_call(scene->L, 1, 1); | ||
287 | |||
288 | // Shove our structure into the registry. | ||
289 | lua_pushlightuserdata(scene->L, scene); | ||
290 | lua_setfield(scene->L, LUA_REGISTRYINDEX, "sceneData"); | ||
291 | |||
292 | // The skang module should have been loaded by now, so we can just grab it out of package.loaded[]. | ||
293 | lua_getglobal(scene->L, "package"); | ||
294 | lua_getfield(scene->L, lua_gettop(scene->L), "loaded"); | ||
295 | lua_remove(scene->L, -2); // Removes "package" | ||
296 | lua_getfield(scene->L, lua_gettop(scene->L), SKANG); | ||
297 | lua_remove(scene->L, -2); // Removes "loaded" | ||
298 | lua_setfield(scene->L, LUA_REGISTRYINDEX, SKANG); | ||
299 | lua_getfield(scene->L, LUA_REGISTRYINDEX, SKANG); // Puts the skang table back on the stack. | ||
300 | skang = lua_gettop(scene->L); | ||
301 | |||
302 | // Same for the scenriLua module, we just loaded it. | ||
303 | lua_getglobal(scene->L, "package"); | ||
304 | lua_getfield(scene->L, lua_gettop(scene->L), "loaded"); | ||
305 | lua_remove(scene->L, -2); // Removes "package" | ||
306 | lua_getfield(scene->L, lua_gettop(scene->L), "scenriLua"); | ||
307 | lua_remove(scene->L, -2); // Removes "loaded" | ||
308 | scenriLua = lua_gettop(scene->L); | ||
309 | |||
310 | // Define our functions. | ||
311 | push_lua(scene->L, "@ ( = $ $ & $ )", skang, THINGASM, scenriLua, "addStuffs", "Add an in world stuffs.", _addStuffsL, | ||
312 | "string,string,string,string,string,number,number,number,number,number,number,number,number", 0); | ||
313 | push_lua(scene->L, "@ ( = $ $ & $ )", skang, THINGASM, scenriLua, "addMaterial", "Add a material to an in world stuffs.", _addMaterialL, | ||
314 | "userdata,number,number,string", 0); | ||
315 | push_lua(scene->L, "@ ( = $ $ & $ )", skang, THINGASM, scenriLua, "stuffsSetup", "Render the stuffs.", _stuffsSetupL, | ||
316 | "userdata,number", 0); | ||
317 | |||
318 | // Pass the enums to scenriLua. | ||
319 | sprintf(buf, "MeshType = {cube = %d, mesh = %d, sphere = %d}", MT_CUBE, MT_MESH, MT_SPHERE); | ||
320 | doLuaString(scene->L, buf, "scenriLua"); | ||
321 | sprintf(buf, "TextureType = {face = %d, normal = %d}", TT_FACE, TT_NORMAL); | ||
322 | doLuaString(scene->L, buf, "scenriLua"); | ||
323 | } | ||
324 | |||
155 | return scene; | 325 | return scene; |
156 | } | 326 | } |
157 | 327 | ||
158 | void scenriDel(Scene_Data *scene) | 328 | void scenriDel(Scene_Data *scene) |
159 | { | 329 | { |
330 | lua_close(scene->L); | ||
331 | |||
160 | // TODO - I should probably free up all this Evas_3D stuff. Oddly Eo doesn't bitch about it, only valgrind. | 332 | // TODO - I should probably free up all this Evas_3D stuff. Oddly Eo doesn't bitch about it, only valgrind. |
161 | // Eo bitches if they are unref'd here. | 333 | // Eo bitches if they are unref'd here. |
162 | // So either Eo or valgrind bitches, depending on what I do. I'll leave them commented out, let valgrind bitch, and blame Evas_3D. | 334 | // So either Eo or valgrind bitches, depending on what I do. I'll leave them commented out, let valgrind bitch, and blame Evas_3D. |
@@ -257,8 +429,8 @@ static vertex *sphere_vertices = NULL; | |||
257 | static int index_count = 0; | 429 | static int index_count = 0; |
258 | static unsigned short *sphere_indices = NULL; | 430 | static unsigned short *sphere_indices = NULL; |
259 | 431 | ||
260 | static inline vec3 | 432 | |
261 | _normalize(const vec3 *v) | 433 | static inline vec3 _normalize(const vec3 *v) |
262 | { | 434 | { |
263 | double l = sqrt(v->x * v->x + v->y * v->y + v->z * v->z); | 435 | double l = sqrt(v->x * v->x + v->y * v->y + v->z * v->z); |
264 | vec3 vec; | 436 | vec3 vec; |
@@ -270,7 +442,6 @@ _normalize(const vec3 *v) | |||
270 | return vec; | 442 | return vec; |
271 | } | 443 | } |
272 | 444 | ||
273 | |||
274 | static void _sphere_init(int precision) | 445 | static void _sphere_init(int precision) |
275 | { | 446 | { |
276 | int i, j; | 447 | int i, j; |
@@ -405,7 +576,7 @@ static void _sphere_init(int precision) | |||
405 | } | 576 | } |
406 | 577 | ||
407 | 578 | ||
408 | void stuffsSetup(ExtantzStuffs *stuffs, globals *ourGlobals, Scene_Data *scene, int fake) | 579 | void stuffsSetup(ExtantzStuffs *stuffs, Scene_Data *scene, int fake) |
409 | { | 580 | { |
410 | char buf[PATH_MAX]; | 581 | char buf[PATH_MAX]; |
411 | Material *m; | 582 | Material *m; |
@@ -419,12 +590,12 @@ void stuffsSetup(ExtantzStuffs *stuffs, globals *ourGlobals, Scene_Data *scene, | |||
419 | // Textures | 590 | // Textures |
420 | if (1 == fake) | 591 | if (1 == fake) |
421 | { | 592 | { |
422 | t = eo_add(EVAS_3D_TEXTURE_CLASS, ourGlobals->evas, | 593 | t = eo_add(EVAS_3D_TEXTURE_CLASS, scene->evas, |
423 | evas_3d_texture_data_set(EVAS_3D_COLOR_FORMAT_RGBA, EVAS_3D_PIXEL_FORMAT_8888, 4, 4, &pixels0[0]) | 594 | evas_3d_texture_data_set(EVAS_3D_COLOR_FORMAT_RGBA, EVAS_3D_PIXEL_FORMAT_8888, 4, 4, &pixels0[0]) |
424 | ); | 595 | ); |
425 | eina_array_push(stuffs->textures, t); | 596 | eina_array_push(stuffs->textures, t); |
426 | 597 | ||
427 | t1 = eo_add(EVAS_3D_TEXTURE_CLASS, ourGlobals->evas, | 598 | t1 = eo_add(EVAS_3D_TEXTURE_CLASS, scene->evas, |
428 | evas_3d_texture_data_set(EVAS_3D_COLOR_FORMAT_RGBA, EVAS_3D_PIXEL_FORMAT_8888, 4, 4, &pixels1[0]) | 599 | evas_3d_texture_data_set(EVAS_3D_COLOR_FORMAT_RGBA, EVAS_3D_PIXEL_FORMAT_8888, 4, 4, &pixels1[0]) |
429 | ); | 600 | ); |
430 | eina_array_push(stuffs->textures, t1); | 601 | eina_array_push(stuffs->textures, t1); |
@@ -433,7 +604,7 @@ void stuffsSetup(ExtantzStuffs *stuffs, globals *ourGlobals, Scene_Data *scene, | |||
433 | EINA_INARRAY_FOREACH(stuffs->stuffs.details.mesh->materials, m) | 604 | EINA_INARRAY_FOREACH(stuffs->stuffs.details.mesh->materials, m) |
434 | { | 605 | { |
435 | snprintf(buf, sizeof(buf), "%s/%s", prefix_data_get(), m->texture); | 606 | snprintf(buf, sizeof(buf), "%s/%s", prefix_data_get(), m->texture); |
436 | ti = eo_add(EVAS_3D_TEXTURE_CLASS, ourGlobals->evas, | 607 | ti = eo_add(EVAS_3D_TEXTURE_CLASS, scene->evas, |
437 | evas_3d_texture_file_set(buf, NULL), | 608 | evas_3d_texture_file_set(buf, NULL), |
438 | evas_3d_texture_filter_set(EVAS_3D_TEXTURE_FILTER_LINEAR, EVAS_3D_TEXTURE_FILTER_LINEAR), // Only for sphere originally. | 609 | evas_3d_texture_filter_set(EVAS_3D_TEXTURE_FILTER_LINEAR, EVAS_3D_TEXTURE_FILTER_LINEAR), // Only for sphere originally. |
439 | evas_3d_texture_filter_set(EVAS_3D_TEXTURE_FILTER_NEAREST, EVAS_3D_TEXTURE_FILTER_NEAREST), // Only for sonic originally. | 610 | evas_3d_texture_filter_set(EVAS_3D_TEXTURE_FILTER_NEAREST, EVAS_3D_TEXTURE_FILTER_NEAREST), // Only for sonic originally. |
@@ -446,7 +617,7 @@ void stuffsSetup(ExtantzStuffs *stuffs, globals *ourGlobals, Scene_Data *scene, | |||
446 | if (1 == fake) | 617 | if (1 == fake) |
447 | { | 618 | { |
448 | eina_accessor_data_get(stuffs->aTexture, 0, (void **) &t); | 619 | eina_accessor_data_get(stuffs->aTexture, 0, (void **) &t); |
449 | mi = eo_add(EVAS_3D_MATERIAL_CLASS, ourGlobals->evas, | 620 | mi = eo_add(EVAS_3D_MATERIAL_CLASS, scene->evas, |
450 | evas_3d_material_enable_set(EVAS_3D_MATERIAL_AMBIENT, EINA_TRUE), | 621 | evas_3d_material_enable_set(EVAS_3D_MATERIAL_AMBIENT, EINA_TRUE), |
451 | evas_3d_material_enable_set(EVAS_3D_MATERIAL_DIFFUSE, EINA_TRUE), | 622 | evas_3d_material_enable_set(EVAS_3D_MATERIAL_DIFFUSE, EINA_TRUE), |
452 | evas_3d_material_enable_set(EVAS_3D_MATERIAL_SPECULAR, EINA_TRUE), | 623 | evas_3d_material_enable_set(EVAS_3D_MATERIAL_SPECULAR, EINA_TRUE), |
@@ -462,7 +633,7 @@ void stuffsSetup(ExtantzStuffs *stuffs, globals *ourGlobals, Scene_Data *scene, | |||
462 | 633 | ||
463 | eina_accessor_data_get(stuffs->aTexture, 1, (void **) &t1); | 634 | eina_accessor_data_get(stuffs->aTexture, 1, (void **) &t1); |
464 | eina_accessor_data_get(stuffs->aTexture, 2, (void **) &ti); | 635 | eina_accessor_data_get(stuffs->aTexture, 2, (void **) &ti); |
465 | mj = eo_add(EVAS_3D_MATERIAL_CLASS, ourGlobals->evas, | 636 | mj = eo_add(EVAS_3D_MATERIAL_CLASS, scene->evas, |
466 | evas_3d_material_enable_set(EVAS_3D_MATERIAL_AMBIENT, EINA_TRUE), | 637 | evas_3d_material_enable_set(EVAS_3D_MATERIAL_AMBIENT, EINA_TRUE), |
467 | evas_3d_material_enable_set(EVAS_3D_MATERIAL_DIFFUSE, EINA_TRUE), | 638 | evas_3d_material_enable_set(EVAS_3D_MATERIAL_DIFFUSE, EINA_TRUE), |
468 | evas_3d_material_enable_set(EVAS_3D_MATERIAL_SPECULAR, EINA_TRUE), | 639 | evas_3d_material_enable_set(EVAS_3D_MATERIAL_SPECULAR, EINA_TRUE), |
@@ -481,7 +652,7 @@ void stuffsSetup(ExtantzStuffs *stuffs, globals *ourGlobals, Scene_Data *scene, | |||
481 | else | 652 | else |
482 | { | 653 | { |
483 | eina_accessor_data_get(stuffs->aTexture, 0, (void **) &t); | 654 | eina_accessor_data_get(stuffs->aTexture, 0, (void **) &t); |
484 | mi = eo_add(EVAS_3D_MATERIAL_CLASS, ourGlobals->evas, | 655 | mi = eo_add(EVAS_3D_MATERIAL_CLASS, scene->evas, |
485 | evas_3d_material_texture_set(EVAS_3D_MATERIAL_DIFFUSE, t), | 656 | evas_3d_material_texture_set(EVAS_3D_MATERIAL_DIFFUSE, t), |
486 | 657 | ||
487 | evas_3d_material_enable_set(EVAS_3D_MATERIAL_AMBIENT, EINA_TRUE), | 658 | evas_3d_material_enable_set(EVAS_3D_MATERIAL_AMBIENT, EINA_TRUE), |
@@ -503,7 +674,7 @@ void stuffsSetup(ExtantzStuffs *stuffs, globals *ourGlobals, Scene_Data *scene, | |||
503 | { | 674 | { |
504 | eina_accessor_data_get(stuffs->aMaterial, 0, (void **) &mi); | 675 | eina_accessor_data_get(stuffs->aMaterial, 0, (void **) &mi); |
505 | eina_accessor_data_get(stuffs->aMaterial, 1, (void **) &mj); | 676 | eina_accessor_data_get(stuffs->aMaterial, 1, (void **) &mj); |
506 | me = eo_add(EVAS_3D_MESH_CLASS, ourGlobals->evas, | 677 | me = eo_add(EVAS_3D_MESH_CLASS, scene->evas, |
507 | evas_3d_mesh_vertex_count_set(24), | 678 | evas_3d_mesh_vertex_count_set(24), |
508 | evas_3d_mesh_frame_add(0), | 679 | evas_3d_mesh_frame_add(0), |
509 | 680 | ||
@@ -529,7 +700,7 @@ void stuffsSetup(ExtantzStuffs *stuffs, globals *ourGlobals, Scene_Data *scene, | |||
529 | _sphere_init(100); | 700 | _sphere_init(100); |
530 | 701 | ||
531 | eina_accessor_data_get(stuffs->aMaterial, 0, (void **) &mi); | 702 | eina_accessor_data_get(stuffs->aMaterial, 0, (void **) &mi); |
532 | me = eo_add(EVAS_3D_MESH_CLASS, ourGlobals->evas, | 703 | me = eo_add(EVAS_3D_MESH_CLASS, scene->evas, |
533 | evas_3d_mesh_vertex_count_set(vertex_count), | 704 | evas_3d_mesh_vertex_count_set(vertex_count), |
534 | evas_3d_mesh_frame_add(0), | 705 | evas_3d_mesh_frame_add(0), |
535 | evas_3d_mesh_frame_vertex_data_set(0, EVAS_3D_VERTEX_POSITION, sizeof(vertex), &sphere_vertices[0].position), | 706 | evas_3d_mesh_frame_vertex_data_set(0, EVAS_3D_VERTEX_POSITION, sizeof(vertex), &sphere_vertices[0].position), |
@@ -550,7 +721,7 @@ void stuffsSetup(ExtantzStuffs *stuffs, globals *ourGlobals, Scene_Data *scene, | |||
550 | { | 721 | { |
551 | eina_accessor_data_get(stuffs->aMaterial, 0, (void **) &mi); | 722 | eina_accessor_data_get(stuffs->aMaterial, 0, (void **) &mi); |
552 | snprintf(buf, sizeof(buf), "%s/%s", prefix_data_get(), stuffs->stuffs.details.mesh->fileName); | 723 | snprintf(buf, sizeof(buf), "%s/%s", prefix_data_get(), stuffs->stuffs.details.mesh->fileName); |
553 | me = eo_add(EVAS_3D_MESH_CLASS, ourGlobals->evas, | 724 | me = eo_add(EVAS_3D_MESH_CLASS, scene->evas, |
554 | evas_3d_mesh_file_set(EVAS_3D_MESH_FILE_TYPE_MD2, buf, NULL), | 725 | evas_3d_mesh_file_set(EVAS_3D_MESH_FILE_TYPE_MD2, buf, NULL), |
555 | evas_3d_mesh_frame_material_set(0, mi), | 726 | evas_3d_mesh_frame_material_set(0, mi), |
556 | evas_3d_mesh_shade_mode_set(EVAS_3D_SHADE_MODE_PHONG) | 727 | evas_3d_mesh_shade_mode_set(EVAS_3D_SHADE_MODE_PHONG) |
@@ -559,7 +730,7 @@ void stuffsSetup(ExtantzStuffs *stuffs, globals *ourGlobals, Scene_Data *scene, | |||
559 | } | 730 | } |
560 | 731 | ||
561 | eina_accessor_data_get(stuffs->aMesh, 0, (void **) &me); | 732 | eina_accessor_data_get(stuffs->aMesh, 0, (void **) &me); |
562 | stuffs->mesh_node = eo_add_custom(EVAS_3D_NODE_CLASS, ourGlobals->evas, evas_3d_node_constructor(EVAS_3D_NODE_TYPE_MESH), | 733 | stuffs->mesh_node = eo_add_custom(EVAS_3D_NODE_CLASS, scene->evas, evas_3d_node_constructor(EVAS_3D_NODE_TYPE_MESH), |
563 | eo_key_data_set("Name", stuffs->stuffs.name, NULL), | 734 | eo_key_data_set("Name", stuffs->stuffs.name, NULL), |
564 | evas_3d_node_position_set(stuffs->stuffs.details.mesh->pos.x, stuffs->stuffs.details.mesh->pos.y, stuffs->stuffs.details.mesh->pos.z), | 735 | evas_3d_node_position_set(stuffs->stuffs.details.mesh->pos.x, stuffs->stuffs.details.mesh->pos.y, stuffs->stuffs.details.mesh->pos.z), |
565 | evas_3d_node_orientation_set(stuffs->stuffs.details.mesh->rot.x, stuffs->stuffs.details.mesh->rot.y, stuffs->stuffs.details.mesh->rot.z, stuffs->stuffs.details.mesh->rot.w), | 736 | evas_3d_node_orientation_set(stuffs->stuffs.details.mesh->rot.x, stuffs->stuffs.details.mesh->rot.y, stuffs->stuffs.details.mesh->rot.z, stuffs->stuffs.details.mesh->rot.w), |
@@ -567,11 +738,19 @@ void stuffsSetup(ExtantzStuffs *stuffs, globals *ourGlobals, Scene_Data *scene, | |||
567 | ); | 738 | ); |
568 | 739 | ||
569 | eo_do(scene->root_node, evas_3d_node_member_add(stuffs->mesh_node)); | 740 | eo_do(scene->root_node, evas_3d_node_member_add(stuffs->mesh_node)); |
570 | eina_clist_add_head(&(ourGlobals->stuffs), &(stuffs->node)); | 741 | eina_clist_add_head(&(scene->stuffs), &(stuffs->node)); |
742 | |||
743 | if (1 == fake) | ||
744 | stuffs->animateStuffs = (aniStuffs) _animateCube; | ||
745 | else if (2 == fake) | ||
746 | stuffs->animateStuffs = (aniStuffs) _animateSphere; | ||
747 | else if (3 == fake) | ||
748 | stuffs->animateStuffs = (aniStuffs) _animateSonic; | ||
749 | |||
571 | } | 750 | } |
572 | 751 | ||
573 | ExtantzStuffs *addStuffs(char *uuid, char *name, char *description, char *owner, | 752 | ExtantzStuffs *addStuffs(char *uuid, char *name, char *description, char *owner, |
574 | char *file, MeshType type, float px, float py, float pz, float rx, float ry, float rz, float rw) | 753 | char *file, MeshType type, double px, double py, double pz, double rx, double ry, double rz, double rw) |
575 | { | 754 | { |
576 | ExtantzStuffs *result = calloc(1, sizeof(ExtantzStuffs)); | 755 | ExtantzStuffs *result = calloc(1, sizeof(ExtantzStuffs)); |
577 | 756 | ||