home *** CD-ROM | disk | FTP | other *** search
- #include "Drone.h"
-
- #include "Game.h"
- #include "Renderer.h"
- #include "log.h"
- #include "matrixmath.h"
-
- #include <math.h>
-
- Drone::Drone(Client* client): Vehicle(client){
-
- bodyModel = NULL;
- bodyAnimator = NULL;
- jetsModel = NULL;
- jetsAnimator = NULL;
- jetsFrame = 1.0f;
-
- dlpcs.clear();
- jetsModelSecondaryColors = NULL;
- bodyModelSecondaryColors = NULL;
- for(int i=0;i<4;i++){
- weaponModelSecondaryColors[i] = NULL;
- }
- }
-
- Drone::~Drone(){
- int i, j;
-
- if( jetsModelSecondaryColors != NULL ){
- for(i=0;i<jetsModel->numMeshes;i++){
- delete[] jetsModelSecondaryColors[i];
- }
- delete[] jetsModelSecondaryColors;
- }
- if( bodyModelSecondaryColors != NULL ){
- for(i=0;i<bodyModel->numMeshes;i++){
- delete[] bodyModelSecondaryColors[i];
- }
- delete[] bodyModelSecondaryColors;
- }
- for(i=0;i<4;i++){
- if( weaponModelSecondaryColors[i] != NULL ){
- for(j=0;j<weapons[i]->model->numMeshes;j++){
- delete[] weaponModelSecondaryColors[i][j];
- }
- delete[] weaponModelSecondaryColors[i];
- }
- }
-
- if( bodyAnimator != NULL )
- delete bodyAnimator;
- if( jetsAnimator != NULL )
- delete jetsAnimator;
-
- for(unsigned int k=0;k<dlpcs.size();k++){
- dlpcs[k].dlpc->vehicles.remove(this);
-
- if( jetsModel != NULL ){
- for(j=0;j<jetsModel->numMeshes;j++){
- delete[] dlpcs[k].jetsModel_colors[j];
- }
- delete[] dlpcs[k].jetsModel_colors;
- }
-
- if( bodyModel != NULL ){
- for(j=0;j<bodyModel->numMeshes;j++){
- delete[] dlpcs[k].bodyModel_colors[j];
- }
- delete[] dlpcs[k].bodyModel_colors;
- }
- }
- dlpcs.clear();
- }
-
-
- void Drone::moveForward(float deltaT){
- vectorMA3d(vel_inp, deltaT*moveSpeed, dir, vel_inp);
- }
- void Drone::moveBackward(float deltaT){
- vectorMA3d(vel_inp, -deltaT*moveSpeed, dir, vel_inp);
- }
- void Drone::moveLeft(float deltaT){
- vectorMA3d(vel_inp, deltaT*moveSpeed, left, vel_inp);
- }
- void Drone::moveRight(float deltaT){
- vectorMA3d(vel_inp, -deltaT*moveSpeed, left, vel_inp);
- }
- void Drone::moveUp(float deltaT){
- vectorMA3d(vel_inp, deltaT*moveSpeed, e2, vel_inp);
- }
- void Drone::moveDown(float deltaT){
- vectorMA3d(vel_inp, -deltaT*moveSpeed, e2, vel_inp);
- }
-
-
- void Drone::move(){
- unsigned int currentMillis = SDL_GetTicks();
-
- if( lastMoveMillis >= currentMillis ) // sanity check
- return;
-
- float deltaT = (currentMillis - lastMoveMillis)/1000.0f;
- lastMoveMillis = currentMillis;
-
- reconstructVectors(); // make sure local COSystem is orthonormal
- anglesFromVectors();
-
- // calc recovery
- calcRecovery();
-
- // set animation
- if( jetsAnimator != NULL ){
- vec3_t tmp1;
- vectorInit3d((float)(cos(yaw)), 0.0f, (float)(sin(yaw)), tmp1);
-
- float dp = vectorDotP3d(tmp1, vel_inp);
- float mod = 0.0f;
- float maxMod = 1.0;
-
- if( fabs(dp) > 0.001 ){
- mod = dp * deltaT * 3.0f;
- maxMod = (float)( 1.0 - fabs(pitch - PI/2.0)*2.0/PI );
- }else{
- if( jetsFrame > 1.01f ){
- mod = -1.5f * deltaT; // backforce
- }else if( jetsFrame < 0.99f ){
- mod = 1.5f * deltaT; // backforce
- }else{
- mod = 0.0;
- }
- maxMod = 1.0;
- }
-
- jetsFrame += mod;
-
- if( jetsFrame > 1.0f + maxMod ){
- jetsFrame = 1.0f + maxMod;
- }
- if( jetsFrame < 1.0f - maxMod){
- jetsFrame = 1.0f - maxMod;
- }
- jetsAnimator->setCurrentFrame(jetsFrame);
- }
-
-
- // do physics
- vectorScale3d(600.0f, vel_inp, physicsInfo.F_i);
- vectorCopy3d(vel, physicsInfo.v);
- physicsInfo.r = 50.0f;
- physicsInfo.g = 0.0f;
- physicsInfo.calcAcceleration();
- vectorMA3d(vel, deltaT, physicsInfo.a, vel);
- if( vectorLength3d(vel) > moveSpeed ){
- vectorNormalize3d(vel, vel);
- vectorScale3d(moveSpeed, vel, vel);
- }
-
-
- vec3_t displacement;
- vectorScale3d(deltaT, vel, displacement);
-
- if( collisionDetection(displacement) ){ // check if move is save
- vectorAdd3d(pos, displacement, pos); // ...and move
- }
-
- vectorScale3d(1.0f/deltaT, displacement, vel);
- }
-
-
- void Drone::addDynamicLightParticleCluster(DynamicLightParticleCluster* dlpc){
- int i, j, k;
- drone_dlpcCombo_t c;
-
- c.dlpc = dlpc;
-
- // JETS
- if( jetsModel != NULL ){
- int frame = (int)jetsAnimator->getCurrentFrame();
- // printf("frame: %i\n", frame);
-
- vec3_t tmp;
- vectorInit3d((float)(cos(yaw)), 0.0f, (float)(sin(yaw)), tmp);
- float m[] = { left[0], left[1], left[2], 0.0f,
- e2[0], e2[1], e2[2], 0.0f,
- tmp[0], tmp[1], tmp[2], 0.0f,
- pos[0], pos[1], pos[2], 1.0f
- };
-
- float im[16];
- float cm[16];
- vec4_t transformedPos;
-
- c.jetsModel_colors = new GLfloat*[jetsModel->numMeshes];
- for(i=0;i<jetsModel->numMeshes;i++){
- Mesh* mesh = jetsModel->meshes[i];
- c.jetsModel_colors[i] = new GLfloat[mesh->numVertices*3];
-
- matrixMultMatrix(m, jetsModel->matrices[frame][i], 4, cm);
- matrixInvert(cm, 4, im);
- vectorInit4d(dlpc->pos[0], dlpc->pos[1], dlpc->pos[2], 1.0f, transformedPos);
- matrixMultVector(im, transformedPos, 4, transformedPos);
- float transformedRadius = dlpc->radius;// * (float)(fabs(im[0]);
-
- for(j=0;j<mesh->numVertices;j++){
- float f = vectorPointDistance3d(transformedPos, &mesh->vertices[j*3]) / transformedRadius;
- if( f < 0.0f ){ // most likely matrix was not inverted correctly...
- // printf("jets: f: %f; tr: %f\n", f, transformedRadius);
- f = 0.0f;
- }
- if( f > 1.0f ){
- // printf("jets: f: %f; tr: %f\n", f, transformedRadius);
- f = 1.0f;
- }
- //f = f > 1.0f ? 1.0f : f;
- vectorScale3d(1.0f - f, dlpc->col, &c.jetsModel_colors[i][j*3]);
- vectorAdd3d(&jetsModelSecondaryColors[i][j*3], &c.jetsModel_colors[i][j*3], &jetsModelSecondaryColors[i][j*3]);
- }
- }
- }
-
- // BODY
- if( bodyModel != NULL ){
- int frame = 0;//(int)jetsAnimator->getCurrentFrame();
- // printf("frame: %i\n", frame);
-
- // vec3_t tmp;
- // vectorInit3d((float)(cos(yaw)), 0.0f, (float)(sin(yaw)), tmp);
- float m[] = { left[0], left[1], left[2], 0.0f,
- up[0], up[1], up[2], 0.0f,
- dir[0], dir[1], dir[2], 0.0f,
- pos[0], pos[1], pos[2], 1.0f
- };
-
- float im[16];
- float cm[16];
- vec4_t transformedPos;
-
- c.bodyModel_colors = new GLfloat*[bodyModel->numMeshes];
- for(i=0;i<bodyModel->numMeshes;i++){
- Mesh* mesh = bodyModel->meshes[i];
- c.bodyModel_colors[i] = new GLfloat[mesh->numVertices*3];
-
- matrixMultMatrix(m, bodyModel->matrices[frame][i], 4, cm);
- matrixInvert(cm, 4, im);
- vectorInit4d(dlpc->pos[0], dlpc->pos[1], dlpc->pos[2], 1.0f, transformedPos);
- matrixMultVector(im, transformedPos, 4, transformedPos);
- float transformedRadius = dlpc->radius;// * (float)fabs(im[0]);
-
- for(j=0;j<mesh->numVertices;j++){
- float f = vectorPointDistance3d(transformedPos, &mesh->vertices[j*3]) / transformedRadius;
- if( f < 0.0f ){ // most likely matrix was not inverted correctly...
- // printf("body: f: %f; tr: %f\n", f, transformedRadius);
- f = 0.0f;
- }
- if( f > 1.0f ){
- // printf("body: f: %f; tr: %f\n", f, transformedRadius);
- f = 1.0f;
- }
- // f = f > 1.0f ? 1.0f : f;
- vectorScale3d(1.0f - f, dlpc->col, &c.bodyModel_colors[i][j*3]);
- vectorAdd3d(&bodyModelSecondaryColors[i][j*3], &c.bodyModel_colors[i][j*3], &bodyModelSecondaryColors[i][j*3]);
- }
- }
- }
-
- // WEAPONS
- for(k=0;k<4;k++){
- if( weapons[k] != NULL ){
- int frame = 0;
- float m[] = { left[0], left[1], left[2], 0.0f,
- up[0], up[1], up[2], 0.0f,
- dir[0], dir[1], dir[2], 0.0f,
- pos[0], pos[1], pos[2], 1.0f
- };
-
- float transM[] = { 1.0f, 0.0f, 0.0f, 0.0f,
- 0.0f, 1.0f, 0.0f, 0.0f,
- 0.0f, 0.0f, 1.0f, 0.0f,
- weapons[k]->mountPoint[0], weapons[k]->mountPoint[1], weapons[k]->mountPoint[2], 1.0f
- };
-
- float im[16];
- float cm[16];
- vec4_t transformedPos;
-
- c.weaponModel_colors[k] = new GLfloat*[weapons[k]->model->numMeshes];
- for(i=0;i<weapons[k]->model->numMeshes;i++){
- Mesh* mesh = weapons[k]->model->meshes[i];
- c.weaponModel_colors[k][i] = new GLfloat[mesh->numVertices*3];
-
- matrixMultMatrix(m, transM, 4, cm);
- matrixMultMatrix(cm, weapons[k]->model->matrices[frame][i], 4, cm);
- matrixInvert(cm, 4, im);
- vectorInit4d(dlpc->pos[0], dlpc->pos[1], dlpc->pos[2], 1.0f, transformedPos);
- matrixMultVector(im, transformedPos, 4, transformedPos);
- float transformedRadius = dlpc->radius;// * (float)fabs(im[0]);
-
- for(j=0;j<mesh->numVertices;j++){
- float f = vectorPointDistance3d(transformedPos, &mesh->vertices[j*3]) / transformedRadius;
- if( f < 0.0f ){ // most likely matrix was not inverted correctly...
- f = 0.0f;
- }
- if( f > 1.0f ){
- f = 1.0f;
- }
- vectorScale3d(1.0f - f, dlpc->col, &c.weaponModel_colors[k][i][j*3]);
- vectorAdd3d(&weaponModelSecondaryColors[k][i][j*3], &c.weaponModel_colors[k][i][j*3], &weaponModelSecondaryColors[k][i][j*3]);
- }
- }
- }
- }
-
- dlpcs.push_back(c);
- // printf("dlpc added!\n");
- }
- void Drone::removeDynamicLightParticleCluster(DynamicLightParticleCluster* dlpc){
- int i,j;
-
- for( vector<drone_dlpcCombo_t>::iterator iter = dlpcs.begin(); iter != dlpcs.end(); iter++ ){
- if( iter->dlpc == dlpc ){
- if( jetsModel != NULL ){
- for(i=0;i<jetsModel->numMeshes;i++){
- Mesh* m = jetsModel->meshes[i];
- for(j=0;j<m->numVertices;j++){
- vectorSub3d(&jetsModelSecondaryColors[i][j*3], &iter->jetsModel_colors[i][j*3], &jetsModelSecondaryColors[i][j*3]);
- }
- delete[] iter->jetsModel_colors[i];
- }
- delete[] iter->jetsModel_colors;
- }
-
- if( bodyModel != NULL ){
- for(i=0;i<bodyModel->numMeshes;i++){
- Mesh* m = bodyModel->meshes[i];
- for(j=0;j<m->numVertices;j++){
- vectorSub3d(&bodyModelSecondaryColors[i][j*3], &iter->bodyModel_colors[i][j*3], &bodyModelSecondaryColors[i][j*3]);
- }
- delete[] iter->bodyModel_colors[i];
- }
- delete[] iter->bodyModel_colors;
- }
-
- for(int k=0;k<4;k++){
- if( weapons[k] != NULL ){
- for(i=0;i<weapons[k]->model->numMeshes;i++){
- Mesh* m = weapons[k]->model->meshes[i];
- for(j=0;j<m->numVertices;j++){
- vectorSub3d(&weaponModelSecondaryColors[k][i][j*3], &iter->weaponModel_colors[k][i][j*3], &weaponModelSecondaryColors[k][i][j*3]);
- }
- delete[] iter->weaponModel_colors[k][i];
- }
- delete[] iter->weaponModel_colors[k];
- }
- }
-
- dlpcs.erase(iter);
- break;
- }
- }
-
- // printf("dlpc removed!\n");
- }
-
-
-
- void Drone::render(){
- int i, j, k;
-
- int lm_sav = Renderer::info.var.lightingMode;
-
- // calc the shading color
- if( Renderer::info.var.shadeVehicles &&
- (Renderer::info.var.lightingMode == LIGHTING_MODE_VERTEX || Renderer::info.var.lightingMode == LIGHTING_MODE_LIGHTMAP) ){
-
- Renderer::info.var.lightingMode = LIGHTING_MODE_VERTEX; // set to vertex lighting because we need vertex colors
-
- vec3_t col, absMin, absMax;
- vectorInit3d(0.0f, 0.0f, 0.0f, col);
- float w_sum = 0.0f;
- float maxDistance = 7.0f;
-
- vectorInit3d(pos[0]-maxDistance, pos[1]-maxDistance, pos[2]-maxDistance, absMin);
- vectorInit3d(pos[0]+maxDistance, pos[1]+maxDistance, pos[2]+maxDistance, absMax);
- vector<SpacePartitioningTreeNode*> nodes = Game::arena->sptree->getLeafNodesIntersectingAABB(absMin, absMax);
-
- for(i=0;i<(signed int)nodes.size();i++){
- // nodes[i]->drawBorders();
- Mesh* m = nodes[i]->mesh;
- if( m != NULL ){
-
- for(j=0;j<m->numVertices;j++){
- float d = vectorPointDistance3d(pos, &m->vertices[j*3]);
- // vec3_t tmp;
- // vectorSub3d(&m->vertices[j*3], pos, tmp);
- // float d = vectorLength3d(tmp);
- if( d < maxDistance /*&& vectorDotP3d(tmp, &m->normals[j*3]) < 0.0f*/ ){
- float w = 1.0f - d/maxDistance;
- w_sum += w;
- vectorMA3d(col, w, &m->colors[j*3], col);
- // Renderer::debug_renderLinesegment(pos, &m->vertices[j*3]);
- }
- }
-
- // if( nearestIndex != -1 ){
- // vectorCopy3d(&m->colors[nearestIndex*3], col);
- // Renderer::debug_renderLinesegment(pos, &m->vertices[nearestIndex*3]);
- // }
- }
- }
-
- if( w_sum > 0.0f ){ // assign new colors
- vectorScale3d(1.0f/w_sum, col, col);
-
- if( bodyModel != NULL ){
- for(i=0;i<bodyModel->numMeshes;i++){
- for(j=0;j<bodyModel->meshes[i]->numColors;j++){
- vectorCopy3d(col, &bodyModel->meshes[i]->colors[j*3]);
- }
- }
- }
- if( jetsModel != NULL ){
- for(i=0;i<jetsModel->numMeshes;i++){
- for(j=0;j<jetsModel->meshes[i]->numColors;j++){
- vectorCopy3d(col, &jetsModel->meshes[i]->colors[j*3]);
- }
- }
- }
- for(k=0;k<4;k++){
- if( weapons[k] == NULL )
- continue;
-
- for(i=0;i<weapons[k]->model->numMeshes;i++){
- for(j=0;j<weapons[k]->model->meshes[i]->numColors;j++){
- vectorCopy3d(col, &weapons[k]->model->meshes[i]->colors[j*3]);
- }
- }
- }
- }else{ // keep old colors
- }
-
- }
-
- // jets
- if( jetsModel != NULL ){
-
- if( Renderer::info.var.useDynamicLighting && jetsModelSecondaryColors != NULL ){ // setup dyn lighting
- for(i=0;i<jetsModel->numMeshes;i++){
- jetsModel->meshes[i]->secondaryColors = jetsModelSecondaryColors[i];
- }
-
- }
-
- glPushMatrix();
-
- vec3_t tmp;
- vectorInit3d((float)(cos(yaw)), 0.0f, (float)(sin(yaw)), tmp);
- float m[] = { left[0], left[1], left[2], 0.0f,
- e2[0], e2[1], e2[2], 0.0f,
- tmp[0], tmp[1], tmp[2], 0.0f,
- pos[0], pos[1], pos[2], 1.0f
- };
- glMultMatrixf(m);
-
- float frame = 0.0f;
- if( jetsAnimator != NULL ){
- frame = jetsAnimator->getCurrentFrame();
- }
- Renderer::renderModel(jetsModel, frame);
-
- glPopMatrix();
-
- if( Renderer::info.var.useDynamicLighting && jetsModelSecondaryColors != NULL ){
- for(i=0;i<jetsModel->numMeshes;i++){
- jetsModel->meshes[i]->secondaryColors = NULL;
- }
- }
- }
-
-
- // body
- if( bodyModel != NULL &&
- !(Game::cam.mode == CAMERA_MODE_FIRST_PERSON && Game::cam.target == this) ){
-
- if( Renderer::info.var.useDynamicLighting && bodyModelSecondaryColors != NULL ){ // setup dyn lighting
- for(i=0;i<bodyModel->numMeshes;i++){
- bodyModel->meshes[i]->secondaryColors = bodyModelSecondaryColors[i];
- }
- }
-
-
-
- glPushMatrix();
- float m[] = { left[0], left[1], left[2], 0.0f,
- up[0], up[1], up[2], 0.0f,
- dir[0], dir[1], dir[2], 0.0f,
- pos[0], pos[1], pos[2], 1.0f
- };
- glMultMatrixf(m);
- Renderer::renderModel(bodyModel);
-
- glPopMatrix();
-
- if( Renderer::info.var.useDynamicLighting && bodyModelSecondaryColors != NULL ){
- for(i=0;i<bodyModel->numMeshes;i++){
- bodyModel->meshes[i]->secondaryColors = NULL;
- }
- }
-
- }
-
- // weapons
- for( k=0; k<4; k++ ){
- if( weapons[k] == NULL )
- continue;
-
- if( Renderer::info.var.useDynamicLighting && weaponModelSecondaryColors[k] != NULL ){ // setup dyn lighting
- for(i=0;i<weapons[k]->model->numMeshes;i++){
- weapons[k]->model->meshes[i]->secondaryColors = weaponModelSecondaryColors[k][i];
- }
- }
-
- glPushMatrix();
- float m[] = { left[0], left[1], left[2], 0.0f,
- up[0], up[1], up[2], 0.0f,
- dir[0], dir[1], dir[2], 0.0f,
- pos[0], pos[1], pos[2], 1.0f
- };
- glMultMatrixf(m);
-
- glTranslatef(weapons[k]->mountPoint[0], weapons[k]->mountPoint[1], weapons[k]->mountPoint[2]);
-
- float frame = 0.0f;
- if( weapons[k]->animator != NULL ){ // setup animation
- frame = weapons[k]->animator->calcCurrentFrame();
- // printf("frame: %f\n", frame);
- }
- Renderer::renderModel(weapons[k]->model, frame);
-
- glPopMatrix();
-
- if( Renderer::info.var.useDynamicLighting && weaponModelSecondaryColors[k] != NULL ){
- for(i=0;i<weapons[k]->model->numMeshes;i++){
- weapons[k]->model->meshes[i]->secondaryColors = NULL;
- }
- }
- }
-
- if( Renderer::info.var.shadeVehicles &&
- (Renderer::info.var.lightingMode == LIGHTING_MODE_VERTEX || Renderer::info.var.lightingMode == LIGHTING_MODE_LIGHTMAP) ){
-
- Renderer::info.var.lightingMode = lm_sav; // restore lm if we did vehcile shading
- }
-
- Vehicle::render();
-
- }
-
-