void L1_SetSoundPosition() { Graphics::Vector3d pos; int minVolume = 10; int maxVolume = 127; float someParam = 0; int argId = 1; lua_Object paramObj; if (g_grim->getCurrScene()) { g_grim->getCurrScene()->getSoundParameters(&minVolume, &maxVolume); } lua_Object nameObj = lua_getparam(argId++); if (!lua_isnumber(nameObj) && !lua_isstring(nameObj)) return; lua_Object actorObj = lua_getparam(argId++); if (lua_isuserdata(actorObj) && lua_tag(actorObj) == MKTAG('A','C','T','R')) { Actor *actor = getactor(actorObj); if (!actor) return; pos = actor->getPos(); } else if (lua_isnumber(actorObj)) { float x = lua_getnumber(actorObj); float y = lua_getnumber(argId++); float z = lua_getnumber(argId++); pos.set(x, y, z); } paramObj = (int)lua_getparam(argId++); if (lua_isnumber(paramObj)) { minVolume = (int)lua_getnumber(paramObj); if (minVolume > 127) minVolume = 127; } paramObj = lua_getparam(argId++); if (lua_isnumber(paramObj)) { maxVolume = (int)lua_getnumber(paramObj); if (maxVolume > 127) maxVolume = 127; else if (maxVolume < minVolume) maxVolume = minVolume; } paramObj = lua_getparam(argId++); if (lua_isnumber(paramObj)) { someParam = (int)lua_getnumber(paramObj); if (someParam < 0.0) someParam = 0.0; } if (g_grim->getCurrScene()) { if (lua_isnumber(nameObj)) error("SetSoundPosition: number is not yet supported"); else { const char *soundName = lua_getstring(nameObj); g_grim->getCurrScene()->setSoundPosition(soundName, pos, minVolume, maxVolume); } } }
/* Given a position and a size this function calculates and pushes * the nearest point to that which will be valid if the boxes are * shrunk by the amount specified. */ void L1_GetShrinkPos() { lua_Object xObj = lua_getparam(1); lua_Object yObj = lua_getparam(2); lua_Object zObj = lua_getparam(3); lua_Object rObj = lua_getparam(4); if (!lua_isnumber(xObj) || !lua_isnumber(yObj) || !lua_isnumber(zObj) || !lua_isnumber(rObj)) return; float x = lua_getnumber(xObj); float y = lua_getnumber(yObj); float z = lua_getnumber(zObj); float r = lua_getnumber(rObj); Graphics::Vector3d pos; pos.set(x, y, z); Sector* sector; g_grim->getCurrScene()->shrinkBoxes(r); g_grim->getCurrScene()->findClosestSector(pos, §or, &pos); g_grim->getCurrScene()->unshrinkBoxes(); if (sector) { lua_pushnumber(pos.x()); lua_pushnumber(pos.y()); lua_pushnumber(pos.z()); } else { lua_pushnil(); } }
void GfxTinyGL::getBoundingBoxPos(const Mesh *model, int *x1, int *y1, int *x2, int *y2) { if (_currentShadowArray) { *x1 = -1; *y1 = -1; *x2 = -1; *y2 = -1; return; } TGLfloat top = 1000; TGLfloat right = -1000; TGLfloat left = 1000; TGLfloat bottom = -1000; TGLfloat winX, winY, winZ; for (int i = 0; i < model->_numFaces; i++) { Graphics::Vector3d v; float* pVertices; for (int j = 0; j < model->_faces[i]._numVertices; j++) { TGLfloat modelView[16], projection[16]; TGLint viewPort[4]; tglGetFloatv(TGL_MODELVIEW_MATRIX, modelView); tglGetFloatv(TGL_PROJECTION_MATRIX, projection); tglGetIntegerv(TGL_VIEWPORT, viewPort); pVertices = model->_vertices + 3 * model->_faces[i]._vertices[j]; v.set(*(pVertices), *(pVertices + 1), *(pVertices + 2)); tgluProject(v.x(), v.y(), v.z(), modelView, projection, viewPort, &winX, &winY, &winZ); if (winX > right) right = winX; if (winX < left) left = winX; if (winY < top) top = winY; if (winY > bottom) bottom = winY; } } float t = bottom; bottom = 480 - top; top = 480 - t; if (left < 0) left = 0; if (right > 639) right = 639; if (top < 0) top = 0; if (bottom > 479) bottom = 479; if (top > 479 || left > 639 || bottom < 0 || right < 0) { *x1 = -1; *y1 = -1; *x2 = -1; *y2 = -1; return; } *x1 = (int)left; *y1 = (int)top; *x2 = (int)right; *y2 = (int)bottom; /* uint16 *dst = (uint16 *)_zb->pbuf; uint16 c = 0xffff; for (int x = left; x <= right; x++) { WRITE_LE_UINT16(dst + 640 * (int)top + x, c); } for (int x = left; x <= right; x++) { WRITE_LE_UINT16(dst + 640 * (int)bottom + x, c); } for (int y = top; y <= bottom; y++) { WRITE_LE_UINT16(dst + 640 * y + (int)left, c); } for (int y = top; y <= bottom; y++) { WRITE_LE_UINT16(dst + 640 * y + (int)right, c); }*/ }