void EyeCamera::movedMouse(int dx, int dy) { if (!m_firstMovePassed) { /* * First move event will be sent on window initialization */ m_firstMovePassed = true; dx -= 0.5 * m_viewport.first; dy -= 0.5 * m_viewport.second; } if (m_trackingEnabled) { vec3d left = cross(m_up, m_front); double xAngle = - FIELD_OF_VIEW * 4.0 * dx / m_viewport.first; mat4d xRotate; xRotate.loadRotation(xAngle, m_up); m_front = vec3d(xRotate * vec4d(m_front, 0.0)); m_front.normalize(); double yAngle = FIELD_OF_VIEW * 4.0 * dy / m_viewport.second; mat4d yRotate; yRotate.loadRotation(yAngle, left); m_front = vec3d(yRotate * vec4d(m_front, 0.0)); m_up = vec3d(yRotate * vec4d(m_up, 0.0)); m_front.normalize(); m_up.normalize(); } }
bool DepthComplexity3D::intersectPlaneTriangle(const vec4d& plane, const Triangle& tri, Segment *seg) { assert(seg); double da, db, dc; da = dot(plane, vec4d(tri.a, 1)); db = dot(plane, vec4d(tri.b, 1)); dc = dot(plane, vec4d(tri.c, 1)); if (da == 0 && db == 0 && dc == 0) // if the triangle is inside the plane, there's no intersection return false; vec3d *p = &seg->a; if (std::signbit(da) != std::signbit(db)) { intersectPlaneSegment(plane, tri.a, tri.b, p); p = &seg->b; } if (std::signbit(db) != std::signbit(dc)) { intersectPlaneSegment(plane, tri.b, tri.c, p); p = &seg->b; } if (std::signbit(dc) != std::signbit(da)) { intersectPlaneSegment(plane, tri.c, tri.a, p); p = &seg->b; } return p == &seg->b; }
void FirstPersonCamera::movedMouse(int dx, int dy) { if (!m_firstMovePassed) { /* * First move event will be sent on window initialization */ m_firstMovePassed = true; dx -= 0.5 * m_viewport.first; dy -= 0.5 * m_viewport.second; } if (m_trackingEnabled) { // vec3d left(-m_front.y, m_front.x, 0.0); double xAngle = - FIELD_OF_VIEW * 4.0 * dx / m_viewport.first; mat4d xRotate; xRotate.loadRotation(xAngle, vec3d(0, 0, 1)); m_front = vec3d(xRotate * vec4d(m_front, 0.0)); m_front.normalize(); // double yAngle = FIELD_OF_VIEW * 4.0 * dy / m_viewport.second; // mat4d yRotate; // yRotate.loadRotation(yAngle, left); // m_front = vec3d(yRotate * vec4d(m_front, 0.0)); m_front.normalize(); } }
vec3d EditorHandler::getPosition(int x, int y) { float winx, winy, winz; ptr<FrameBuffer> fb = SceneManager::getCurrentFrameBuffer(); vec4<GLint> vp = fb->getViewport(); float width = (float) vp.z; float height = (float) vp.w; if (depthBuffer == NULL) { fb->readPixels(x, vp.w - y, 1, 1, DEPTH_COMPONENT, FLOAT, Buffer::Parameters(), CPUBuffer(&winz)); } else { winz = depthBuffer[x + (vp.w - y) * vp.z]; } winx = (x * 2.0f) / width - 1.0f; winy = 1.0f - (y * 2.0f) / height; winz = 2.0f * winz - 1.0f; ptr<SceneManager> manager = editors[0]->getTerrain()->getOwner(); mat4d screenToWorld = manager->getWorldToScreen().inverse(); vec4d p = screenToWorld * vec4d(winx, winy, winz, 1); double px = p.x / p.w; double py = p.y / p.w; double pz = p.z / p.w; return vec3d(px, py, pz); }
bool EditorHandler::mouseClick(button b, state s, modifier m, int x, int y) { if (editors.empty()) { return false; } if (b == LEFT_BUTTON && (m & SHIFT) != 0 && s == DOWN) { ptr<FrameBuffer> fb = SceneManager::getCurrentFrameBuffer(); vec4<GLint> vp = fb->getViewport(); depthBuffer = new float[vp.z * vp.w]; fb->readPixels(vp.x, vp.y, vp.z, vp.w, DEPTH_COMPONENT, FLOAT, Buffer::Parameters(), CPUBuffer(depthBuffer)); paint = true; vec3d p = getPosition(x, y); strokes.clear(); strokes.push_back(vec4d(p.x, p.y, p.z, radius)); newStrokes++; return true; } if (b == LEFT_BUTTON && s == UP && paint) { update = true; if (depthBuffer != NULL) { delete[] depthBuffer; depthBuffer = NULL; } strokes.clear(); paint = false; } return false; }
SceneManager::visibility SphericalDeformation::getVisibility(const TerrainNode *t, const box3d &localBox) const { vec3d deformedBox[4]; deformedBox[0] = localToDeformed(vec3d(localBox.xmin, localBox.ymin, localBox.zmin)); deformedBox[1] = localToDeformed(vec3d(localBox.xmax, localBox.ymin, localBox.zmin)); deformedBox[2] = localToDeformed(vec3d(localBox.xmax, localBox.ymax, localBox.zmin)); deformedBox[3] = localToDeformed(vec3d(localBox.xmin, localBox.ymax, localBox.zmin)); double a = (localBox.zmax + R) / (localBox.zmin + R); double dx = (localBox.xmax - localBox.xmin) / 2 * a; double dy = (localBox.ymax - localBox.ymin) / 2 * a; double dz = localBox.zmax + R; double f = sqrt(dx * dx + dy * dy + dz * dz) / (localBox.zmin + R); const vec4d *deformedFrustumPlanes = t->getDeformedFrustumPlanes(); SceneManager::visibility v0 = getVisibility(deformedFrustumPlanes[0], deformedBox, f); if (v0 == SceneManager::INVISIBLE) { return SceneManager::INVISIBLE; } SceneManager::visibility v1 = getVisibility(deformedFrustumPlanes[1], deformedBox, f); if (v1 == SceneManager::INVISIBLE) { return SceneManager::INVISIBLE; } SceneManager::visibility v2 = getVisibility(deformedFrustumPlanes[2], deformedBox, f); if (v2 == SceneManager::INVISIBLE) { return SceneManager::INVISIBLE; } SceneManager::visibility v3 = getVisibility(deformedFrustumPlanes[3], deformedBox, f); if (v3 == SceneManager::INVISIBLE) { return SceneManager::INVISIBLE; } SceneManager::visibility v4 = getVisibility(deformedFrustumPlanes[4], deformedBox, f); if (v4 == SceneManager::INVISIBLE) { return SceneManager::INVISIBLE; } vec3d c = t->getDeformedCamera(); double lSq = c.squaredLength(); double rm = R + min(0.0, localBox.zmin); double rM = R + localBox.zmax; double rmSq = rm * rm; double rMSq = rM * rM; vec4d farPlane = vec4d(c.x, c.y, c.z, sqrt((lSq - rmSq) * (rMSq - rmSq)) - rmSq); SceneManager::visibility v5 = getVisibility(farPlane, deformedBox, f); if (v5 == SceneManager::INVISIBLE) { return SceneManager::INVISIBLE; } if (v0 == SceneManager::FULLY_VISIBLE && v1 == SceneManager::FULLY_VISIBLE && v2 == SceneManager::FULLY_VISIBLE && v3 == SceneManager::FULLY_VISIBLE && v4 == SceneManager::FULLY_VISIBLE && v5 == SceneManager::FULLY_VISIBLE) { return SceneManager::FULLY_VISIBLE; } return SceneManager::PARTIALLY_VISIBLE; }
void SphericalDeformation::setScreenUniforms(ptr<SceneNode> context, ptr<TerrainQuad> q, ptr<Program> prog) const { vec3d p0 = vec3d(q->ox, q->oy, R); vec3d p1 = vec3d(q->ox + q->l, q->oy, R); vec3d p2 = vec3d(q->ox, q->oy + q->l, R); vec3d p3 = vec3d(q->ox + q->l, q->oy + q->l, R); vec3d pc = (p0 + p3) * 0.5; double l0, l1, l2, l3; vec3d v0 = p0.normalize(&l0); vec3d v1 = p1.normalize(&l1); vec3d v2 = p2.normalize(&l2); vec3d v3 = p3.normalize(&l3); if (screenQuadCornersU != NULL) { mat4d deformedCorners = mat4d( v0.x * R, v1.x * R, v2.x * R, v3.x * R, v0.y * R, v1.y * R, v2.y * R, v3.y * R, v0.z * R, v1.z * R, v2.z * R, v3.z * R, 1.0, 1.0, 1.0, 1.0); screenQuadCornersU->setMatrix((localToScreen * deformedCorners).cast<float>()); } if (screenQuadVerticalsU != NULL) { mat4d deformedVerticals = mat4d( v0.x, v1.x, v2.x, v3.x, v0.y, v1.y, v2.y, v3.y, v0.z, v1.z, v2.z, v3.z, 0.0, 0.0, 0.0, 0.0); screenQuadVerticalsU->setMatrix((localToScreen * deformedVerticals).cast<float>()); } if (screenQuadCornerNormsU != NULL) { screenQuadCornerNormsU->set(vec4d(l0, l1, l2, l3).cast<float>()); } if (tangentFrameToWorldU != NULL) { vec3d uz = pc.normalize(); vec3d ux = vec3d::UNIT_Y.crossProduct(uz).normalize(); vec3d uy = uz.crossProduct(ux); mat4d ltow = context->getLocalToWorld(); mat3d tangentFrameToWorld = mat3d( ltow[0][0], ltow[0][1], ltow[0][2], ltow[1][0], ltow[1][1], ltow[1][2], ltow[2][0], ltow[2][1], ltow[2][2]) * mat3d( ux.x, uy.x, uz.x, ux.y, uy.y, uz.y, ux.z, uy.z, uz.z); tangentFrameToWorldU->setMatrix(tangentFrameToWorld.cast<float>()); } }
vec3d SceneManager::getWorldCoordinates(int x, int y) { float winx, winy, winz; ptr<FrameBuffer> fb = FrameBuffer::getDefault(); vec4<GLint> vp = fb->getViewport(); float width = (float) vp.z; float height = (float) vp.w; fb->readPixels(x, vp.w - y, 1, 1, DEPTH_COMPONENT, FLOAT, Buffer::Parameters(), CPUBuffer(&winz)); winx = (x * 2.0f) / width - 1.0f; winy = 1.0f - (y * 2.0f) / height; winz = 2.0f * winz - 1.0f; mat4d screenToWorld = getWorldToScreen().inverse(); vec4d p = screenToWorld * vec4d(winx, winy, winz, 1); return vec3d(p.x / p.w, p.y / p.w, p.z / p.w); }
bool EditorHandler::mouseMotion(int x, int y) { if (editors.empty()) { return false; } lastPos = vec2i(x, y); if (paint) { vec4d l = strokes[strokes.size() - 1]; vec3d p = getPosition(x, y); if ((p - vec3d(l.x, l.y, l.z)).length() > radius * 0.2) { strokes.push_back(vec4d(p.x, p.y, p.z, radius)); newStrokes++; } return true; } else { redisplay(0.0, 0.0); } return false; }
void v4math_object::test<1>() { LLVector4 vec4; ensure("1:LLVector4:Fail to initialize " ,((0 == vec4.mV[VX]) && (0 == vec4.mV[VY]) && (0 == vec4.mV[VZ])&& (1.0f == vec4.mV[VW]))); F32 x = 10.f, y = -2.3f, z = -.023f, w = -2.0f; LLVector4 vec4a(x,y,z); ensure("2:LLVector4:Fail to initialize " ,((x == vec4a.mV[VX]) && (y == vec4a.mV[VY]) && (z == vec4a.mV[VZ])&& (1.0f == vec4a.mV[VW]))); LLVector4 vec4b(x,y,z,w); ensure("3:LLVector4:Fail to initialize " ,((x == vec4b.mV[VX]) && (y == vec4b.mV[VY]) && (z == vec4b.mV[VZ])&& (w == vec4b.mV[VW]))); const F32 vec[4] = {.112f ,23.2f, -4.2f, -.0001f}; LLVector4 vec4c(vec); ensure("4:LLVector4:Fail to initialize " ,((vec[0] == vec4c.mV[VX]) && (vec[1] == vec4c.mV[VY]) && (vec[2] == vec4c.mV[VZ])&& (vec[3] == vec4c.mV[VW]))); LLVector3 vec3(-2.23f,1.01f,42.3f); LLVector4 vec4d(vec3); ensure("5:LLVector4:Fail to initialize " ,((vec3.mV[VX] == vec4d.mV[VX]) && (vec3.mV[VY] == vec4d.mV[VY]) && (vec3.mV[VZ] == vec4d.mV[VZ])&& (1.f == vec4d.mV[VW]))); F32 w1 = -.234f; LLVector4 vec4e(vec3,w1); ensure("6:LLVector4:Fail to initialize " ,((vec3.mV[VX] == vec4e.mV[VX]) && (vec3.mV[VY] == vec4e.mV[VY]) && (vec3.mV[VZ] == vec4e.mV[VZ])&& (w1 == vec4e.mV[VW]))); }
void TestLinAlg() { // Instantiate templates, check sizes, make sure operators compile etc. static_assert(sizeof(Vec2f) == 8 , "Vec2f size test failed" ); static_assert(sizeof(Vec3f) == 12 , "Vec3f size test failed" ); static_assert(sizeof(Vec4f) == 16 , "Vec4f size test failed" ); static_assert(sizeof(Vec2d) == 16 , "Vec2d size test failed" ); static_assert(sizeof(Vec3d) == 24 , "Vec3d size test failed" ); static_assert(sizeof(Vec4d) == 32 , "Vec4d size test failed" ); static_assert(sizeof(Vec2i) == 8 , "Vec2i size test failed" ); static_assert(sizeof(Vec3i) == 12 , "Vec3i size test failed" ); static_assert(sizeof(Vec4i) == 16 , "Vec4i size test failed" ); static_assert(sizeof(Vec2ui) == 8 , "Vec2ui size test failed" ); static_assert(sizeof(Vec3ui) == 12 , "Vec3ui size test failed" ); static_assert(sizeof(Vec4ui) == 16 , "Vec4ui size test failed" ); static_assert(sizeof(Matrix44f) == 64 , "Matrix44f size test failed"); static_assert(sizeof(Matrix44d) == 128, "Matrix44d size test failed"); Vec2f vec2f(0.0f, 0.0f); Vec3f vec3f(0.0f, 0.0f, 0.0f); Vec4f vec4f(0.0f, 0.0f, 0.0f, 0.0f); Vec2d vec2d(0.0, 0.0); Vec3d vec3d(0.0, 0.0, 0.0); Vec4d vec4d(0.0, 0.0, 0.0, 0.0); Vec2i vec2i(-1, -1); Vec3i vec3i(-1, -1, -1); Vec4i vec4i(-1, -1, -1, -1); Vec2ui vec2ui(0, 0); Vec3ui vec3ui(0, 0, 0); Vec4ui vec4ui(0, 0, 0, 0); float f = 0.0f; bool b = false; b = (vec3f == vec3f); b = (vec3f != vec3f); vec3f = Vec3f(1.0f) + Vec3f(2.0f); vec3f = Vec3f(1.0f) - Vec3f(2.0f); vec3f = Vec3f(1.0f) * Vec3f(2.0f); vec3f = Vec3f(1.0f) / Vec3f(2.0f); vec3f = Vec3f(1.0f) * f; vec3f = f * Vec3f(1.0f); vec3f = Vec3f(1.0f) / f; vec3f = -Vec3f(1.0f); vec3f += Vec3f(1.0f); vec3f -= Vec3f(1.0f); vec3f *= Vec3f(1.0f); vec3f /= Vec3f(1.0f); vec3f *= f; vec3f /= f; f = vec3f[0]; vec3f[0] = f; f = Length(vec3f); f = LengthSquared(vec3f); vec3f = Normalize(vec3f); f = Dot(Vec3f(1.0f), Vec3f(2.0f)); vec3f = Vec3f(1.0f) ^ Vec3f(2.0f); Matrix44f matf; matf.Identity(); Matrix44d matd; matf.RotationX(1); matf.RotationY(1); matf.RotationZ(1); matf.Scaling(1); b = matf == matf; matf = matf * matf; matf.BuildLookAtMatrix(Vec3f(0.0f, 10.0f, 10.0f), Vec3f(0.0f)); matf.BuildProjection(90.0f, 4.0f / 3.0f, 1.0f, 1000.0f); Vec3f out; matf.Transf3x3(vec3f, out); matf.Transf4x4(vec3f, out); matf.Transpose3x3(); matf.Transpose4x4(); matf.Invert(); }
vec4d DepthComplexity3D::makePlane(const vec3d& a, const vec3d& b, const vec3d& c) { vec3d normal = cross(b-a, c-a); normal.normalize(); double d = dot(a, normal); return vec4d(normal, -d); }
vec4d operator* (double a, vec4d v) { return vec4d(v.v[0] * a, v.v[1] * a, v.v[2] * a, v.v[3] * a); }
vec4d mat44::column(int n) { return vec4d(m[0][n], m[1][n], m[2][n], m[3][n]); }
void EditorHandler::redisplay(double t, double dt) { if (editors.empty()) { return; } if (update) { for (unsigned int i = 0; i < editors.size(); ++i) { if (editors[i]->isActive()) { editors[i]->update(); } } update = false; } // mouse in world space vec3d p = getPosition(lastPos.x, lastPos.y); // camera in local space, altitude in local space float altitude = -1.0f; for (unsigned int i = 0; i < editors.size(); ++i) { if (editors[i]->isActive()) { mat4d screenToLocal = editors[i]->getTerrain()->getLocalToScreen().inverse(); vec4d c = screenToLocal * vec4d(0.0, 0.0, 1.0, 0.0); double cx = c.x / c.w; double cy = c.y / c.w; double cz = c.z / c.w; if (isFinite(cx) && isFinite(cy)) { vec3d dv = editors[i]->getTerrainNode()->deform->deformedToLocal(vec3d(cx, cy, cz)); if (isFinite(dv.z)) { altitude = dv.z; break; } } } } // field of view angle vec4d frustum[6]; ptr<SceneManager> manager = editors[0]->getTerrain()->getOwner(); SceneManager::getFrustumPlanes(manager->getCameraToScreen(), frustum); vec3d left = frustum[0].xyz().normalize(); vec3d right = frustum[1].xyz().normalize(); float fov = (float) safe_acos(-left.dotproduct(right)); // pencil radius radius = altitude * tan(fov / 2.0) * relativeRadius; for (unsigned int i = 0; i < editors.size(); ++i) { if (editors[i]->isActive()) { editors[i]->setPencil(vec4f(p.x, p.y, p.z, radius), vec4f(brushColor[0], brushColor[1], brushColor[2], brushColor[3]), paint); } } if (newStrokes > 0) { for (unsigned int i = 0; i < editors.size(); ++i) { if (editors[i]->isActive()) { editors[i]->edit(strokes); } } } newStrokes = 0; }
int main(int argc, char *argv[]) { int i; float r = 0; int f = -15; int g = 0; int l = 0; int y = 0; int u = 15; int q = 0; int gamestate=0; int PlayerHP=15, Bosshealth=30, enemy1health=5, enemy2health=5, Bigtimer=600, CD; int SpawnLemon1=0, SpawnLemon2=0, SpawnLemon3=0, SpawnBigLemon=0, enemybullet=0; float Lemonx1=0, Lemonx2=0, Lemonx3=0, LemonxBig=0, enemybulletx=0; int Lemony1=0, Lemony2=0, Lemony3=0, LemonyBig=0, enemybullety=0; int a=0, b=0, c=0, d=0, count, Goomba_attack1=0, Goomba_attack2=0, Goomba_move1, Goomba_move2; Space *space; Entity *cube1,*cube2, *Actor; char bGameLoopRunning = 1; Vec3D Bosspos = {u, y, 2}; Vec3D enemy1pos = {5, 10, 2}; Vec3D enemy2pos = {5, -10, 2}; Vec3D cameraPosition = {0,0,70.3}; Vec3D cameraRotation = {0,0,360}; SDL_Event e; Obj *megaman,*boss, *mapp, *mape, *lemon, *BossHPBar, *PlayerHPBar, *Goomba; Sprite *megamantexture, *bosstexture, *maptexture1, *maptexture2, *lemontexture, *BosstextureHP, *PlayertextureHP, *Goombatexture; init_logger("gametest3d.log"); if (graphics3d_init(1024,768,1,"gametest3d",33) != 0) { return -1; } model_init(); obj_init(); entity_init(255); //load objects, models here, replace cube with megaman megaman = obj_load("models/MPU.obj"); //load his uv map "texture file" megamantexture = LoadSprite("models/MegaManBody1.png",1024,1024); PlayerHPBar = obj_load("models/cube.obj"); PlayertextureHP = NULL; boss = obj_load("models/Fireman.obj"); bosstexture = LoadSprite("models/FireManBody1.png",1024,1024); BossHPBar = obj_load("models/cube.obj"); BosstextureHP = NULL; Goomba = obj_load("models/goomba.obj"); Goombatexture = LoadSprite("models/goomba_tex.png",1024,1024); mapp = obj_load("models/MidtermMapSingle.obj"); maptexture1 = LoadSprite("models/PlayerTile(Red).png",1024,1024); mape = obj_load("models/MidtermMapSingle.obj"); maptexture2 = LoadSprite("models/BossTile(Blue).png",1024,1024); lemon = obj_load("models/cube.obj"); lemontexture = NULL;//LoadSprite("models/cube_text.png",1024,1024); while (bGameLoopRunning) { entity_think_all(); while ( SDL_PollEvent(&e) ) { if (e.type == SDL_QUIT) { bGameLoopRunning = 0; } else if (e.type == SDL_KEYDOWN) { if (e.key.keysym.sym == SDLK_ESCAPE) { bGameLoopRunning = 0; } else if (e.key.keysym.sym == SDLK_x) { cameraPosition.z++; } else if (e.key.keysym.sym == SDLK_z) { cameraPosition.z--; } else if (e.key.keysym.sym == SDLK_h) { vec3d_add( cameraPosition, cameraPosition, vec3d( -sin(cameraRotation.z * DEGTORAD), cos(cameraRotation.z * DEGTORAD), 0 )); } else if (e.key.keysym.sym == SDLK_y) { vec3d_add( cameraPosition, cameraPosition, vec3d( sin(cameraRotation.z * DEGTORAD), -cos(cameraRotation.z * DEGTORAD), 0 )); } else if (e.key.keysym.sym == SDLK_j) { vec3d_add( cameraPosition, cameraPosition, vec3d( cos(cameraRotation.z * DEGTORAD), sin(cameraRotation.z * DEGTORAD), 0 )); } else if (e.key.keysym.sym == SDLK_g) { vec3d_add( cameraPosition, cameraPosition, vec3d( -cos(cameraRotation.z * DEGTORAD), -sin(cameraRotation.z * DEGTORAD), 0 )); } else if (e.key.keysym.sym == SDLK_d) { if(f >= -5) { f = -5; } else { f += 10; } } else if (e.key.keysym.sym == SDLK_a) { if(f <= -20) { f = -25; } else { f -= 10; } } else if (e.key.keysym.sym == SDLK_w) { if(g >= 5) { g = 10; } else { g += 10; } } else if (e.key.keysym.sym == SDLK_s) { g -= 10; if(g <= -5) { g = -10; } } else if (e.key.keysym.sym == SDLK_LEFT) { cameraRotation.z += 1; } else if (e.key.keysym.sym == SDLK_RIGHT) { cameraRotation.z -= 1; } else if (e.key.keysym.sym == SDLK_UP) { cameraRotation.x += 1; } else if (e.key.keysym.sym == SDLK_DOWN) { cameraRotation.x -= 1; } else if (e.key.keysym.sym == SDLK_SPACE) { CD = TIME + Bigtimer; } else if (e.key.keysym.sym == SDLK_n) { if (enemy1health <= 0 && enemy2health <= 0) { gamestate=1; } } else if (e.key.keysym.sym == SDLK_n) { if (enemy1health <= 0 && enemy2health <= 0) { gamestate=1; } } } else if (e.type == SDL_KEYUP) { if (e.key.keysym.sym == SDLK_SPACE) { if (TIME >= CD && SpawnBigLemon !=1) { SpawnBigLemon = 1; LemonxBig = f; LemonyBig = g; } else if (SpawnLemon1 != 1) { SpawnLemon1 = 1; Lemonx1 = f; Lemony1 = g; } else if (SpawnLemon2 != 1) { SpawnLemon2 = 1; Lemonx2 = f; Lemony2 = g; } else if (SpawnLemon3 != 1) { SpawnLemon3 = 1; Lemonx3 = f; Lemony3 = g; } } } } graphics3d_frame_begin(); glPushMatrix(); set_camera( cameraPosition, cameraRotation); //entity_draw_all(); if (PlayerHP > 0 ) { //Megaman obj_draw( megaman, vec3d(f, g, 2), vec3d(90,90,0), vec3d(0.5,0.5,0.5), vec4d(1,1,1,1), megamantexture ); //Megaman HP BAR obj_draw( PlayerHPBar, vec3d(-30+PlayerHP/(2),20,2), vec3d(90,-90,0), vec3d(.9,.9,PlayerHP/(2)), vec4d(0,1,0,1), PlayertextureHP ); } //Megaman Projectiles //Lemon1 if (SpawnLemon1 != 0) { obj_draw( lemon, vec3d(Lemonx1 + a*(.4), Lemony1, 4), vec3d(90,90,0), vec3d(1,1,2), vec4d(.95,.89,0,1), lemontexture ); a++; if (Lemonx1 + a*(.4) >=30) { SpawnLemon1 = 0; a=0; } else if (Lemonx1 + a*(.4) == enemy1pos.x && Lemony1 == enemy1pos.y) { SpawnLemon1 = 0; a=0; enemy1health -= 1; //slog("Enemy Health %d",enemy1health); } else if (Lemonx1 + a*(.4) == enemy2pos.x && Lemony1 == enemy2pos.y) { SpawnLemon1 = 0; a=0; enemy2health -= 1; //slog("Enemy Health %d",enemy2health); } else if (gamestate == 1 && Lemonx1 + a*(.4) == Bosspos.x && Lemony1 == Bosspos.y) { SpawnLemon1 = 0; a=0; Bosshealth -= 1; //slog("Boss Health %d",Bosshealth); } } //Lemon2 if (SpawnLemon2 != 0) { obj_draw( lemon, vec3d(Lemonx2 + b*(.4), Lemony2, 4), vec3d(90,90,0), vec3d(1,1,2), vec4d(.95,.89,0,1), lemontexture ); b++; if (Lemonx2 + b*(.4) >=30) { SpawnLemon2 = 0; b=0; } else if (Lemonx2 + b*(.4) == enemy1pos.x && Lemony2 == enemy1pos.y) { SpawnLemon2 = 0; b=0; enemy1health -= 1; //slog("Enemy Health %d",enemy1health); } else if (Lemonx2 + b*(.4) == enemy2pos.x && Lemony2 == enemy2pos.y) { SpawnLemon2 = 0; b=0; enemy2health -= 1; //slog("Enemy Health %d",enemy2health); } else if (gamestate == 1 && Lemonx2 + b*(.4) == Bosspos.x && Lemony2 == Bosspos.y) { SpawnLemon2 = 0; b=0; Bosshealth -= 1; //slog("Boss Health %d",Bosshealth); } } if (SpawnLemon3 != 0) { obj_draw( lemon, vec3d(Lemonx3 + c*(.4), Lemony3, 4), vec3d(90,90,0), vec3d(1,1,2), vec4d(.95,.89,0,1), lemontexture ); c++; //lemons fly off staege if (Lemonx3 + c*(.4) >=30) { SpawnLemon3 = 0; c=0; } //lemons collide with enemies else if (Lemonx3 + c*(.4) == enemy1pos.x && Lemony3 == enemy1pos.y) { SpawnLemon3 = 0; c=0; enemy1health -= 1; slog("Enemy Health %d",enemy1health); } else if (Lemonx3 + c*(.4) == enemy2pos.x && Lemony3 == enemy2pos.y) { SpawnLemon3 = 0; c=0; enemy2health -= 1; slog("Enemy Health %d",enemy2health); } else if (gamestate == 1 && Lemonx3 + c*(.4) == Bosspos.x && Lemony3 == Bosspos.y) { SpawnLemon3 = 0; c=0; Bosshealth -= 1; //slog("Boss Health %d",Bosshealth); } } if (SpawnBigLemon != 0) { obj_draw( lemon, vec3d(LemonxBig + d*(.4), LemonyBig, 4), vec3d(90,90,0), vec3d(2,2,4), vec4d(.9,.3,.1,1), lemontexture ); d++; if (LemonxBig + d*(.4) >=30) { SpawnBigLemon = 0; d=0; } else if (LemonxBig + d*(.4) == enemy1pos.x && LemonyBig == enemy1pos.y) { SpawnBigLemon = 0; d=0; enemy1health -= 5; //slog("Enemy Health %d",enemy1health); } else if (LemonxBig + d*(.4) == enemy2pos.x && LemonyBig == enemy2pos.y) { SpawnBigLemon = 0; d=0; enemy2health -= 5; //slog("Enemy Health %d",enemy2health); } else if (gamestate == 1 && LemonxBig + d*(.4) == Bosspos.x && LemonyBig == Bosspos.y) { SpawnBigLemon = 0; d=0; Bosshealth -= 5; slog("Boss Health %d",Bosshealth); } } //MAP obj_draw( mapp, vec3d(-15,0,2), vec3d(90,90,0), vec3d(5,5,5), vec4d(1,1,1,1), maptexture1 ); obj_draw( mape, vec3d(15,0,2), vec3d(90,90,0), vec3d(5,5,5), vec4d(1,1,1,1), maptexture2 ); //Enemies if (gamestate == 0) { if (enemy1health > 0) { //enemy_move(enemypos.x,enemypos.y, &enemypos); //enemy_attack1(Goomba_attack1, &enemy1pos); obj_draw( Goomba, vec3d(enemy1pos.x,enemy1pos.y,2), vec3d(90,-90,0), vec3d(0.1,0.1,0.1), vec4d(1,1,1,1), Goombatexture ); if (Goomba_attack1 == 0) { Goomba_attack1 = rand_ranged( 1, 5); //start to (end - 1) if (Goomba_attack1 == 2) { Goomba_attack1 = 1; } }; if (Goomba_attack1 == 1) { enemy1pos.x -=.1; if (enemy1pos.x <= -30) { Goomba_attack1 = 0; enemy1pos.x = 5; } } } else { enemy1pos.x = 50; enemy1pos.y = 50; } if (enemy2health > 0) { //enemy_move(enemypos.x,enemypos.y, &enemypos); //enemy_attack2(Goomba_attack2, &enemy2pos); obj_draw( Goomba, vec3d(enemy2pos.x,enemy2pos.y,2), vec3d(90,-90,0), vec3d(0.1,0.1,0.1), vec4d(1,1,1,1), Goombatexture ); //bottom Goomba won't attack if (Goomba_attack2 == 0) { Goomba_attack2 = rand_ranged( 1, 5); //start to (end - 1) if (Goomba_attack2 == 2) { Goomba_attack2 = 1; } }; if (Goomba_attack2 == 1) { enemy2pos.x -=.1; if (enemy2pos.x <= -30) { Goomba_attack2 = 0; enemy2pos.x = 5; } } } else { enemy2pos.x = 50; enemy2pos.y = 50; } } if (gamestate != 0) { if (Bosshealth > 0) { Boss_move(Bosspos.x,Bosspos.y, &Bosspos); //Fire man obj_draw( boss, vec3d(Bosspos.x,Bosspos.y,2), vec3d(90,-90,0), vec3d(0.5,0.5,0.5), vec4d(1,1,1,1), bosstexture ); obj_draw( BossHPBar, vec3d(30-Bosshealth/(2.5),20,2), vec3d(90,-90,0), vec3d(.9,.9,Bosshealth/(2.5)), vec4d(1,0,0,1), BosstextureHP ); } else { obj_free(boss); Bosspos.x = 50; Bosspos.y = 50; slog("You WIN!"); } } if (r > 360)r -= 360; glPopMatrix(); /* drawing code above here! */ graphics3d_next_frame(); } return 0; }
vec4d vec4d::quatMult(vec4d x) { return vec4d(v[3] * x.v[0] + v[0] * x.v[3] + v[1] * x.v[2] - v[2] * x.v[1], v[3] * x.v[1] + v[1] * x.v[3] + v[2] * x.v[0] - v[0] * x.v[2], v[3] * x.v[2] + v[2] * x.v[3] + v[0] * x.v[1] - v[1] * x.v[0], v[3] * x.v[3] - v[0] * x.v[0] - v[1] * x.v[1] - v[2] * x.v[2]); }
vec4d vec4d::operator+ (vec4d w) { return vec4d(v[0] + w.v[0], v[1] + w.v[1], v[2] + w.v[2], v[3] + w.v[3]); }
vec4d vec4d::operator- (vec4d w) { return vec4d(v[0] - w.v[0], v[1] - w.v[1], v[2] - w.v[2], v[3] - w.v[3]); }
int main(int argc, char *argv[]) { int i; float r = 0; Space *space; Entity *cube1,*cube2; char bGameLoopRunning = 1; Vec3D cameraPosition = {-10,3,0}; Vec3D cameraRotation = {180,0,180}; SDL_Event e; Obj *bgobj; Sprite *bgtext; //my variables Ship *playerShip; int specMode; init_logger("gametest3d.log"); if (graphics3d_init(1024,768,1,"gametest3d",33) != 0) { return -1; } model_init(); obj_init(); entity_init(255); initShips(); bgobj = obj_load("models/mountainvillage.obj"); bgtext = LoadSprite("models/mountain_text.png",1024,1024); //cube1 = newCube(vec3d(0,0,0),"Cubert"); //cube2 = newCube(vec3d(10,0,0),"Hobbes"); //cube1->body.velocity.x = 0.1; space = space_new(); space_set_steps(space,100); space_add_body(space,&cube1->body); space_add_body(space,&cube2->body); //my variables specMode = 0; numShips = 0; shipVel = 0; shipRot = 0; turretRot = 0; gunElev = 0; realTurrRot = 0; playerShip = spawnShip(space, vec3d(-10,0,0), 1); while (bGameLoopRunning) { updateAllShipPos(); for (i = 0; i < 100;i++) { space_do_step(space); } updateAllShipComp(); applyGrav(); if(specMode == 0) { cameraPosition.x = playerShip->hull->body.position.x; cameraPosition.y = (playerShip->hull->body.position.y + 5); cameraPosition.z = playerShip->hull->body.position.z; } while ( SDL_PollEvent(&e) ) { if (e.type == SDL_QUIT) { bGameLoopRunning = 0; } else if (e.type == SDL_KEYDOWN) { if (e.key.keysym.sym == SDLK_ESCAPE) { bGameLoopRunning = 0; } else if (e.key.keysym.sym == SDLK_SPACE) { cameraPosition.z++; } else if (e.key.keysym.sym == SDLK_z) { cameraPosition.z--; } else if (e.key.keysym.sym == SDLK_w) { vec3d_add( cameraPosition, cameraPosition, vec3d( -sin(cameraRotation.z * DEGTORAD), cos(cameraRotation.z * DEGTORAD), 0 )); } else if (e.key.keysym.sym == SDLK_s) { vec3d_add( cameraPosition, cameraPosition, vec3d( sin(cameraRotation.z * DEGTORAD), -cos(cameraRotation.z * DEGTORAD), 0 )); } else if (e.key.keysym.sym == SDLK_d) { vec3d_add( cameraPosition, cameraPosition, vec3d( cos(cameraRotation.z * DEGTORAD), sin(cameraRotation.z * DEGTORAD), 0 )); } else if (e.key.keysym.sym == SDLK_a) { vec3d_add( cameraPosition, cameraPosition, vec3d( -cos(cameraRotation.z * DEGTORAD), -sin(cameraRotation.z * DEGTORAD), 0 )); } else if (e.key.keysym.sym == SDLK_LEFT) { cameraRotation.y -= 1; } else if (e.key.keysym.sym == SDLK_RIGHT) { cameraRotation.y += 1; } else if (e.key.keysym.sym == SDLK_UP) { cameraRotation.x += 1; } else if (e.key.keysym.sym == SDLK_DOWN) { cameraRotation.x -= 1; } else if (e.key.keysym.sym == SDLK_y && shipVel < 0.4) { shipVel += 0.1; } else if (e.key.keysym.sym == SDLK_h && shipVel > 0.05) { shipVel -= 0.1; } else if (e.key.keysym.sym == SDLK_j) { shipRot += 0.5; if(shipRot >= 360){shipRot -= 360;} } else if (e.key.keysym.sym == SDLK_g) { shipRot -= 0.5; if(shipRot < 0){shipRot += 360;} } else if (e.key.keysym.sym == SDLK_m && turretRot < 135) { turretRot += 1; } else if (e.key.keysym.sym == SDLK_b && turretRot > -135) { turretRot -= 1; } else if (e.key.keysym.sym == SDLK_o && gunElev < 50) { gunElev += 0.5; } else if (e.key.keysym.sym == SDLK_l && gunElev > -5) { gunElev -= 0.5; } else if (e.key.keysym.sym == SDLK_q) { if(specMode == 0){specMode = 1;} else {specMode = 0;} } else if (e.key.keysym.sym == SDLK_p) { fireBullet(space, playerShip->gun->body.position, realTurrRot, gunElev, 0.5, -1); } else if (e.key.keysym.sym == SDLK_x) { fireBullet(space, playerShip->hull->body.position, shipRot, 0, 0, -2); } else if (e.key.keysym.sym == SDLK_1) { startLevel(space, 1); } else if (e.key.keysym.sym == SDLK_2) { startLevel(space, 2); } else if (e.key.keysym.sym == SDLK_3) { startLevel(space, 3); } } } graphics3d_frame_begin(); glPushMatrix(); set_camera( cameraPosition, cameraRotation); entity_draw_all(); //updateAllShipModels(); obj_draw( bgobj, vec3d(0,0,2), vec3d(90,90,0), vec3d(5,5,5), vec4d(1,1,1,1), bgtext ); if (r > 360)r -= 360; glPopMatrix(); /* drawing code above here! */ graphics3d_next_frame(); } return 0; }
vec4d operator* (vec4d v, double a) { return vec4d(v.v[0] * a, v.v[1] * a, v.v[2] * a, v.v[3] * a); }
bool DrawOceanTask::Impl::run() { if (Logger::DEBUG_LOGGER != NULL) { Logger::DEBUG_LOGGER->log("OCEAN", "DrawOcean"); } ptr<FrameBuffer> fb = SceneManager::getCurrentFrameBuffer(); ptr<Program> prog = SceneManager::getCurrentProgram(); if (o->nbWavesU == NULL) { o->nbWavesU = prog->getUniform1f("nbWaves"); o->wavesU = prog->getUniformSampler("wavesSampler"); o->cameraToOceanU = prog->getUniformMatrix4f("cameraToOcean"); o->screenToCameraU = prog->getUniformMatrix4f("screenToCamera"); o->cameraToScreenU = prog->getUniformMatrix4f("cameraToScreen"); o->oceanToCameraU = prog->getUniformMatrix3f("oceanToCamera"); o->oceanToWorldU = prog->getUniformMatrix4f("oceanToWorld"); o->oceanCameraPosU = prog->getUniform3f("oceanCameraPos"); o->oceanSunDirU = prog->getUniform3f("oceanSunDir"); o->horizon1U = prog->getUniform3f("horizon1"); o->horizon2U = prog->getUniform3f("horizon2"); o->timeU = prog->getUniform1f("time"); o->radiusU = prog->getUniform1f("radius"); o->heightOffsetU = prog->getUniform1f("heightOffset"); o->lodsU = prog->getUniform4f("lods"); assert(o->nbWavesU != NULL); o->generateWaves(); } vector< ptr<TileSampler> > uniforms; SceneNode::FieldIterator ui = n->getFields(); while (ui.hasNext()) { ptr<TileSampler> u = ui.next().cast<TileSampler>(); if (u != NULL && u->getTerrain(0) != NULL) { u->setTileMap(); } } // compute ltoo = localToOcean transform, where ocean frame = tangent space at // camera projection on sphere o->radius in local space mat4d ctol = n->getLocalToCamera().inverse(); vec3d cl = ctol * vec3d::ZERO; // camera in local space if ((o->radius == 0.0 && cl.z > o->zmin) || (o->radius > 0.0 && cl.length() > o->radius + o->zmin) || (o->radius < 0.0 && vec2d(cl.y, cl.z).length() < -o->radius - o->zmin)) { o->oldLtoo = mat4d::IDENTITY; o->offset = vec3d::ZERO; return true; } vec3d ux, uy, uz, oo; if (o->radius == 0.0) { // flat ocean ux = vec3d::UNIT_X; uy = vec3d::UNIT_Y; uz = vec3d::UNIT_Z; oo = vec3d(cl.x, cl.y, 0.0); } else if (o->radius > 0.0) { // spherical ocean uz = cl.normalize(); // unit z vector of ocean frame, in local space if (o->oldLtoo != mat4d::IDENTITY) { ux = vec3d(o->oldLtoo[1][0], o->oldLtoo[1][1], o->oldLtoo[1][2]).crossProduct(uz).normalize(); } else { ux = vec3d::UNIT_Z.crossProduct(uz).normalize(); } uy = uz.crossProduct(ux); // unit y vector oo = uz * o->radius; // origin of ocean frame, in local space } else { // cylindrical ocean uz = vec3d(0.0, -cl.y, -cl.z).normalize(); ux = vec3d::UNIT_X; uy = uz.crossProduct(ux); oo = vec3d(cl.x, 0.0, 0.0) + uz * o->radius; } mat4d ltoo = mat4d( ux.x, ux.y, ux.z, -ux.dotproduct(oo), uy.x, uy.y, uy.z, -uy.dotproduct(oo), uz.x, uz.y, uz.z, -uz.dotproduct(oo), 0.0, 0.0, 0.0, 1.0); // compute ctoo = cameraToOcean transform mat4d ctoo = ltoo * ctol; if (o->oldLtoo != mat4d::IDENTITY) { vec3d delta = ltoo * (o->oldLtoo.inverse() * vec3d::ZERO); o->offset += delta; } o->oldLtoo = ltoo; mat4d ctos = n->getOwner()->getCameraToScreen(); mat4d stoc = ctos.inverse(); vec3d oc = ctoo * vec3d::ZERO; if (o->oceanSunDirU != NULL) { // TODO how to get sun dir in a better way? SceneManager::NodeIterator i = n->getOwner()->getNodes("light"); if (i.hasNext()) { ptr<SceneNode> l = i.next(); vec3d worldSunDir = l->getLocalToParent() * vec3d::ZERO; vec3d oceanSunDir = ltoo.mat3x3() * (n->getWorldToLocal().mat3x3() * worldSunDir); o->oceanSunDirU->set(oceanSunDir.cast<float>()); } } vec4<GLint> screen = fb->getViewport(); vec4d frustum[6]; SceneManager::getFrustumPlanes(ctos, frustum); vec3d left = frustum[0].xyz().normalize(); vec3d right = frustum[1].xyz().normalize(); float fov = (float) safe_acos(-left.dotproduct(right)); float pixelSize = atan(tan(fov / 2.0f) / (screen.w / 2.0f)); // angle under which a screen pixel is viewed from the camera o->cameraToOceanU->setMatrix(ctoo.cast<float>()); o->screenToCameraU->setMatrix(stoc.cast<float>()); o->cameraToScreenU->setMatrix(ctos.cast<float>()); o->oceanToCameraU->setMatrix(ctoo.inverse().mat3x3().cast<float>()); o->oceanCameraPosU->set(vec3f(float(-o->offset.x), float(-o->offset.y), float(oc.z))); if (o->oceanToWorldU != NULL) { o->oceanToWorldU->setMatrix((n->getLocalToWorld() * ltoo.inverse()).cast<float>()); } if (o->horizon1U != NULL) { float h = oc.z; vec3d A0 = (ctoo * vec4d((stoc * vec4d(0.0, 0.0, 0.0, 1.0)).xyz(), 0.0)).xyz(); vec3d dA = (ctoo * vec4d((stoc * vec4d(1.0, 0.0, 0.0, 0.0)).xyz(), 0.0)).xyz(); vec3d B = (ctoo * vec4d((stoc * vec4d(0.0, 1.0, 0.0, 0.0)).xyz(), 0.0)).xyz(); if (o->radius == 0.0) { o->horizon1U->set(vec3f(-(h * 1e-6 + A0.z) / B.z, -dA.z / B.z, 0.0)); o->horizon2U->set(vec3f::ZERO); } else { double h1 = h * (h + 2.0 * o->radius); double h2 = (h + o->radius) * (h + o->radius); double alpha = B.dotproduct(B) * h1 - B.z * B.z * h2; double beta0 = (A0.dotproduct(B) * h1 - B.z * A0.z * h2) / alpha; double beta1 = (dA.dotproduct(B) * h1 - B.z * dA.z * h2) / alpha; double gamma0 = (A0.dotproduct(A0) * h1 - A0.z * A0.z * h2) / alpha; double gamma1 = (A0.dotproduct(dA) * h1 - A0.z * dA.z * h2) / alpha; double gamma2 = (dA.dotproduct(dA) * h1 - dA.z * dA.z * h2) / alpha; o->horizon1U->set(vec3f(-beta0, -beta1, 0.0)); o->horizon2U->set(vec3f(beta0 * beta0 - gamma0, 2.0 * (beta0 * beta1 - gamma1), beta1 * beta1 - gamma2)); } } o->timeU->set(n->getOwner()->getTime() * 1e-6); if (o->radiusU != NULL) { o->radiusU->set(o->radius < 0.0 ? -o->radius : o->radius); } o->heightOffsetU->set(-o->meanHeight); o->lodsU->set(vec4f(o->resolution, pixelSize * o->resolution, log(o->lambdaMin) / log(2.0f), (o->nbWavesU->get() - 1.0f) / (log(o->lambdaMax) / log(2.0f) - log(o->lambdaMin) / log(2.0f)))); if (o->screenGrid == NULL || o->screenWidth != screen.z || o->screenHeight != screen.w) { o->screenWidth = screen.z; o->screenHeight = screen.w; o->screenGrid = new Mesh<vec2f, unsigned int>(TRIANGLES, GPU_STATIC); o->screenGrid->addAttributeType(0, 2, A32F, false); float f = 1.25f; int NX = int(f * screen.z / o->resolution); int NY = int(f * screen.w / o->resolution); for (int i = 0; i < NY; ++i) { for (int j = 0; j < NX; ++j) { o->screenGrid->addVertex(vec2f(2.0*f*j/(NX-1.0f)-f, 2.0*f*i/(NY-1.0f)-f)); } } for (int i = 0; i < NY-1; ++i) { for (int j = 0; j < NX-1; ++j) { o->screenGrid->addIndice(i*NX+j); o->screenGrid->addIndice(i*NX+j+1); o->screenGrid->addIndice((i+1)*NX+j); o->screenGrid->addIndice((i+1)*NX+j); o->screenGrid->addIndice(i*NX+j+1); o->screenGrid->addIndice((i+1)*NX+j+1); } } } fb->draw(prog, *(o->screenGrid)); return true; }
operator vec4d(void) const { return vec4d(v[0][0], v[0][1], v[1][0], v[1][1]); }
vec4d vec3d::tohc() { return vec4d(v[0], v[1], v[2], 1); }
vec4d vec4d::quatConj() { return vec4d(v[0], -v[1], -v[2], -v[3]); }