From 94d93023d0c9fef8550e1d76f84a89d68936e87f Mon Sep 17 00:00:00 2001 From: "Ben Russell (300178622)" Date: Wed, 7 Nov 2012 14:34:23 +1300 Subject: [PATCH] added local PMF rendering --- common.h | 2 +- docs/modding_lua.txt | 14 ++++++++-- lua.c | 35 +++++++++++++++++++++++-- pkg/base/main_client.lua | 55 +++++----------------------------------- render.c | 33 ++++++++++++++++-------- 5 files changed, 75 insertions(+), 64 deletions(-) diff --git a/common.h b/common.h index cf72b2c..494c846 100644 --- a/common.h +++ b/common.h @@ -170,7 +170,7 @@ void net_deinit(void); void render_vxl_redraw(camera_t *camera, map_t *map); void render_cubemap(uint32_t *pixels, int width, int height, int pitch, camera_t *camera, map_t *map); void render_pmf_bone(uint32_t *pixels, int width, int height, int pitch, camera_t *cam_base, - model_bone_t *bone, + model_bone_t *bone, int islocal, float px, float py, float pz, float ry, float rx, float scale); int render_init(int width, int height); void render_deinit(void); diff --git a/docs/modding_lua.txt b/docs/modding_lua.txt index 7260a75..580216e 100644 --- a/docs/modding_lua.txt +++ b/docs/modding_lua.txt @@ -82,7 +82,17 @@ table = common.get_map_pillar(px, pz) @ this will be nil if there is no map loaded - note, the data wraps around here! + note, the data wraps around here (wrt px,pz)! + +common.set_map_pillar(px, pz, table) + sets a full pillar of data + + this will be nil if there is no map loaded + + the data is checked before setting, + and will throw a lua error if it fails. + + note, the data wraps around here (wrt px,pz)! client.camera_point(dx, dy, dz, zoom = 1.0, roll = 0.0) @ points the camera in a direction with zoom factor "zoom" @@ -180,7 +190,7 @@ client.model_render_bone_global(pmf, boneidx, px, py, pz, ry, rx, scale) @ then around X by "rx" radians, and scaled "scale" times -client.model_render_bone_local(pmf, boneidx, px, py, pz, ry, rx, scale) +client.model_render_bone_local(pmf, boneidx, px, py, pz, ry, rx, scale) @ renders a bone at camera-local position (px,py,pz), rotated around Y by "ry" radians, diff --git a/lua.c b/lua.c index 7541db0..a092dd4 100644 --- a/lua.c +++ b/lua.c @@ -459,7 +459,6 @@ int icelua_fn_client_camera_get_forward(lua_State *L) return 3; } -// client.model_render_bone_global(pmf, boneidx, px, py, pz, ry, rx, scale) int icelua_fn_client_model_render_bone_global(lua_State *L) { int top = icelua_assert_stack(L, 8, 8); @@ -486,7 +485,38 @@ int icelua_fn_client_model_render_bone_global(lua_State *L) scale = lua_tonumber(L, 8); render_pmf_bone(screen->pixels, screen->w, screen->h, screen->pitch/4, &tcam, - bone, px, py, pz, ry, rx, scale); + bone, 0, px, py, pz, ry, rx, scale); + + return 0; +} + +int icelua_fn_client_model_render_bone_local(lua_State *L) +{ + int top = icelua_assert_stack(L, 8, 8); + float px, py, pz; + float rx, ry; + float scale; + + model_t *pmf = lua_touserdata(L, 1); + if(pmf == NULL) + return luaL_error(L, "not a model"); + + int boneidx = lua_tointeger(L, 2); + if(boneidx < 0 || boneidx >= pmf->bonelen) + return luaL_error(L, "bone index %d out of range, len is %d", boneidx, pmf->bonelen); + model_bone_t *bone = pmf->bones[boneidx]; + + px = lua_tonumber(L, 3); + py = lua_tonumber(L, 4); + pz = lua_tonumber(L, 5); + + ry = lua_tonumber(L, 6); + rx = lua_tonumber(L, 7); + + scale = lua_tonumber(L, 8); + + render_pmf_bone(screen->pixels, screen->w, screen->h, screen->pitch/4, &tcam, + bone, 1, px, py, pz, ry, rx, scale); return 0; } @@ -518,6 +548,7 @@ struct icelua_entry icelua_common[] = { {icelua_fn_common_model_bone_set, "model_bone_set"}, {icelua_fn_common_model_bone_find, "model_bone_find"}, {icelua_fn_client_model_render_bone_global, "model_render_bone_global"}, + {icelua_fn_client_model_render_bone_local, "model_render_bone_local"}, {NULL, NULL} }; diff --git a/pkg/base/main_client.lua b/pkg/base/main_client.lua index 3a13b5f..0a4fe55 100644 --- a/pkg/base/main_client.lua +++ b/pkg/base/main_client.lua @@ -38,6 +38,7 @@ BTSK_LOOKRIGHT = SDLK_RIGHT zoom = 1.0 angx = 0.0 angy = 0.0 +rotpos = 0.0 key_left = false key_right = false @@ -54,7 +55,6 @@ key_space = false -- create a test model mdl_test = client.model_new(1) print(client.model_len(mdl_test)) ---[[ mdl_test_bone_data = { {radius=192, x= 0 ,y= 0 ,z= 0 , r=255,g=170,b=0 }, {radius=96 , x= 256,y= 0 ,z= 0 , r=255,g=0 ,b=0 }, @@ -64,41 +64,8 @@ mdl_test_bone_data = { {radius=96 , x= 0 ,y=-256,z= 0 , r=255,g=0 ,b=255}, {radius=96 , x= 0 ,y= 0 ,z=-256, r=255,g=255,b=0 }, } -]] -mdl_test_bone_data = {} mdl_test, mdl_test_bone = client.model_bone_new(mdl_test) -function setzapper() - local i - mdl_test_bone_data[1] = {radius=100, x=0,y=0,z=0, r=96,g=255,b=48} - for i=2,4000 do - local t = math.floor(math.random()*(i-2))+1 - t = i-1 - local rd = mdl_test_bone_data[t].radius - mdl_test_bone_data[i] = { - radius=math.floor(math.random()*50+50), - x=mdl_test_bone_data[t].x+math.floor((math.random()*2-1)*rd), - y=mdl_test_bone_data[t].y+math.floor((math.random()*2-1)*rd), - z=mdl_test_bone_data[t].z+math.floor((math.random()*2-1)*rd), - r=96,g=255,b=48, - } - math.random() - end -end -print(mdl_test, mdl_test_bone) -setzapper() client.model_bone_set(mdl_test, mdl_test_bone, "test", mdl_test_bone_data) -do - local boneidx - boneidx = client.model_bone_find(mdl_test, "test") - print(boneidx) - boneidx = client.model_bone_find(mdl_test, "boner") - print(boneidx) - boneidx = client.model_bone_find(mdl_test, "abcdefghijklmnopqrstuvwxyz") - print(boneidx) - boneidx = client.model_bone_find(mdl_test, "") - print(boneidx) -end ---TODO! --[[ client.model_bone_free(mdl_test, mdl_test_bone) client.model_free(mdl_test) @@ -180,14 +147,7 @@ function h_tick_camfly(sec_current, sec_delta) client.camera_move_to(nx, ny, nz) end - - - --setzapper() - local i - for i=1,#mdl_test_bone_data do - mdl_test_bone_data[i].radius = 100+50*math.sin((sec_current*1000+i)*math.pi*2/500) - end - client.model_bone_set(mdl_test, mdl_test_bone, "test", mdl_test_bone_data) + rotpos = rotpos + sec_delta*120.0 -- wait a bit return 0.01 @@ -240,16 +200,13 @@ function client.hook_key(key, state) end end -rotpos1 = 0 -rotpos2 = 0 -rotpos3 = 0 function client.hook_render() client.model_render_bone_global(mdl_test, mdl_test_bone, 120.5, 50.5, 150.5, - rotpos1, rotpos2, 1.0+0.5*math.sin(rotpos3)) - rotpos1 = rotpos1 + 0.01 - rotpos2 = rotpos2 + 0.004 - rotpos3 = rotpos3 + 0.071 + rotpos*0.01, rotpos*0.004, 1.0+0.5*math.sin(rotpos*0.071)) + client.model_render_bone_local(mdl_test, mdl_test_bone, + 1-0.2, 600/800-0.2, 1.0, + rotpos*0.01, rotpos*0.004, 0.1) end print("pkg/base/main_client.lua loaded.") diff --git a/render.c b/render.c index 2bfd4f3..1b847a4 100644 --- a/render.c +++ b/render.c @@ -832,7 +832,7 @@ void render_pmf_box(float x, float y, float z, float depth, float r, uint32_t co } void render_pmf_bone(uint32_t *pixels, int width, int height, int pitch, camera_t *cam_base, - model_bone_t *bone, + model_bone_t *bone, int islocal, float px, float py, float pz, float ry, float rx, float scale) { // stash stuff in globals to prevent spamming the stack too much @@ -877,9 +877,16 @@ void render_pmf_bone(uint32_t *pixels, int width, int height, int pitch, camera_ z *= scale; // offsettate - x += (px - cam_base->mpx); - y += (py - cam_base->mpy); - z += (pz - cam_base->mpz); + x += px; + y += py; + z += pz; + + if(!islocal) + { + x -= cam_base->mpx; + y -= cam_base->mpy; + z -= cam_base->mpz; + } // get correct centre depth float max_axis = fabsf(x); @@ -891,14 +898,20 @@ void render_pmf_bone(uint32_t *pixels, int width, int height, int pitch, camera_ float depth = max_axis/dlen; // cameranananinate - float nx = x*cam_base->mxx+y*cam_base->mxy+z*cam_base->mxz; - float ny = x*cam_base->myx+y*cam_base->myy+z*cam_base->myz; - float nz = x*cam_base->mzx+y*cam_base->mzy+z*cam_base->mzz; - - depth *= nz; + if(!islocal) + { + float nx = x*cam_base->mxx+y*cam_base->mxy+z*cam_base->mxz; + float ny = x*cam_base->myx+y*cam_base->myy+z*cam_base->myz; + float nz = x*cam_base->mzx+y*cam_base->mzy+z*cam_base->mzz; + + x = nx; + y = ny; + z = nz; + } + depth *= z; // plotinate - render_pmf_box(-nx, ny, nz, depth, pt->radius*scale, color); + render_pmf_box(-x, y, z, depth, pt->radius*scale, color); } }