void SetAIVecHeading(Ship *ship, SpaceObjRotImpTarg *target, vector *trajectory) { //real32 range; ShipStaticInfo *shipstaticinfo = (ShipStaticInfo *)ship->staticinfo; vector tmpvec; udword target_class; real32 randegf; sdword randeg; matrix tmpmat; vector targetheading; MinelayerCorvetteSpec *spec = (MinelayerCorvetteSpec *)ship->ShipSpecifics; MinelayerCorvetteStatics *minelayercorvettestatics; minelayercorvettestatics = (MinelayerCorvetteStatics *) ((ShipStaticInfo *)(ship->staticinfo))->custstatinfo; matGetVectFromMatrixCol3(targetheading,target->rotinfo.coordsys) if(target != NULL) { if(target->objtype == OBJ_ShipType) target_class = ((Ship *)target)->staticinfo->shipclass; else target_class = CLASS_NonCombat; } if (vecDotProduct(targetheading,*trajectory) > 0) { //Attack accross front of ship :) vecAddTo(spec->aivec,targetheading); vecAddTo(spec->aivec,*trajectory); vecScalarMultiply(spec->aivec,spec->aivec,minelayercorvettestatics->FlyAwayDist[target_class]); } else { //test if(randombetween(1,2) & 1) { vecCrossProduct(spec->aivec,*trajectory, targetheading); } else { vecCrossProduct(spec->aivec, targetheading, *trajectory); } vecAddTo(spec->aivec, *trajectory); vecScalarMultiply(spec->aivec,spec->aivec,minelayercorvettestatics->FlyAwayDist[target_class]); } if(!(target->posinfo.isMoving & ISMOVING_MOVING)) { //if target isn't moving, randomize trajectory randeg = randombetween(5,30); randegf = (real32) ((randeg & 1) ? randeg : -randeg); randegf = (real32) randeg; randegf = DEG_TO_RAD(randegf); matMakeRotAboutZ(&tmpmat,(real32)cos(randegf),(real32)sin(randegf)); matMultiplyMatByVec(&tmpvec,&tmpmat,&spec->aivec); spec->aivec = tmpvec; } vecAddTo(spec->aivec,target->posinfo.position); //need change aishipFlyToPointAvoidingObjs(ship,&spec->aivec,AISHIP_FastAsPossible | AISHIP_PointInDirectionFlying,INTERCEPTORBREAK_MINVELOCITY); }
void getTriangleNormal(Vec tri[3], Vec norm) { Vec v0,v1; vecSub(tri[1], tri[0], v0); vecSub(tri[2], tri[0], v1); vecCrossProduct(v0, v1, norm); //VecCross(v0, v1, norm); vecNormalize(norm); }
void P2MultiBeamFrigateAttackPassive(Ship *ship,Ship *target,bool rotate) { ShipStaticInfo *shipstaticinfo = (ShipStaticInfo *)ship->staticinfo; P2MultiBeamFrigateSpec *spec = (P2MultiBeamFrigateSpec *)ship->ShipSpecifics; P2MultiBeamFrigateStatics *frigstat = (P2MultiBeamFrigateStatics *)shipstaticinfo->custstatinfo; vector trajectory; vector heading, temp; real32 range; P2MultiBeamFrigateAttackDoAttack(ship,(SpaceObjRotImpTarg *)target,1000.0f,TRUE); return; aishipGetTrajectory(ship, (SpaceObjRotImpTarg *)target, &trajectory); range = RangeToTarget(ship,(SpaceObjRotImpTarg *)target,&trajectory); if ( (range < frigstat->MultiBeamRange[ship->tacticstype]) && (rotate) ) { temp = trajectory; temp.z+=5; temp.y+=5; temp.x+=5; vecCrossProduct(heading,trajectory,temp); vecNormalize(&heading); vecNormalize(&trajectory); if (aitrackHeadingAndUp(ship,&heading,&trajectory,0.99f)) { if (!spec->steady) aitrackForceHeading(ship,&heading,&trajectory); spec->steady = TRUE; } else spec->steady = FALSE; } shipstaticinfo->custshipheader.CustShipFire(ship, (SpaceObjRotImpTarg *)target); }
void DrawGLScene5() { Vec v1,v2,v3,v4,v5,norm; glClear(GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT); glLoadIdentity(); glLightfv(GL_LIGHT0, GL_POSITION,LightPosition); glTranslatef(-1.5f,0.0f,-6.0f); glRotatef(rtri,0.0f,1.0f,0.0f); glColor3f(0.8f,0.0f,0.0f); glBegin(GL_TRIANGLES); //Notice the process here... //1. build verts //2. make 2 vectors //3. find cross product. that's the normal //4. normalize it to a length of 1 vecMake( 0.0f, 1.0f, 0.0f, v1); vecMake(-1.0f,-1.0f, 1.0f, v2); vecMake( 1.0f,-1.0f, 1.0f, v3); vecSub(v2,v1,v4); vecSub(v3,v1,v5); vecCrossProduct(v4,v5,norm); vecNormalize(norm); glNormal3fv(norm); glVertex3fv(v1); glVertex3fv(v2); glVertex3fv(v3); vecMake( 0.0f, 1.0f, 0.0f,v1); vecMake( 1.0f,-1.0f, 1.0f,v2); vecMake( 1.0f,-1.0f,-1.0f,v3); vecSub(v2,v1,v4); vecSub(v3,v1,v5); vecCrossProduct(v4,v5,norm); vecNormalize(norm); glNormal3fv(norm); glVertex3fv(v1); glVertex3fv(v2); glVertex3fv(v3); vecMake( 0.0f, 1.0f, 0.0f,v1); vecMake( 1.0f,-1.0f,-1.0f,v2); vecMake(-1.0f,-1.0f,-1.0f,v3); vecSub(v2,v1,v4); vecSub(v3,v1,v5); vecCrossProduct(v4,v5,norm); vecNormalize(norm); glNormal3fv(norm); glVertex3fv(v1); glVertex3fv(v2); glVertex3fv(v3); vecMake( 0.0f, 1.0f, 0.0f,v1); vecMake(-1.0f,-1.0f,-1.0f,v2); vecMake(-1.0f,-1.0f, 1.0f,v3); vecSub(v2,v1,v4); vecSub(v3,v1,v5); vecCrossProduct(v4,v5,norm); vecNormalize(norm); glNormal3fv(norm); glVertex3fv(v1); glVertex3fv(v2); glVertex3fv(v3); glEnd(); glLoadIdentity(); glLightfv(GL_LIGHT0, GL_POSITION, LightPosition); glTranslatef(1.5f,0.0f,-7.0f); glRotatef(rquad,1.0f,1.0f,1.0f); glColor3f(0.0f,0.5f,1.0f); glBegin(GL_QUADS); //top //notice the normal being set glNormal3f( 0.0f, 1.0f, 0.0f); glVertex3f( 1.0f, 1.0f,-1.0f); glVertex3f(-1.0f, 1.0f,-1.0f); glVertex3f(-1.0f, 1.0f, 1.0f); glVertex3f( 1.0f, 1.0f, 1.0f); // bottom of cube glNormal3f( 0.0f, -1.0f, 0.0f); glVertex3f( 1.0f,-1.0f, 1.0f); glVertex3f(-1.0f,-1.0f, 1.0f); glVertex3f(-1.0f,-1.0f,-1.0f); glVertex3f( 1.0f,-1.0f,-1.0f); // front of cube glNormal3f( 0.0f, 0.0f, 1.0f); glVertex3f( 1.0f, 1.0f, 1.0f); glVertex3f(-1.0f, 1.0f, 1.0f); glVertex3f(-1.0f,-1.0f, 1.0f); glVertex3f( 1.0f,-1.0f, 1.0f); // back of cube. glNormal3f( 0.0f, 0.0f, -1.0f); glVertex3f( 1.0f,-1.0f,-1.0f); glVertex3f(-1.0f,-1.0f,-1.0f); glVertex3f(-1.0f, 1.0f,-1.0f); glVertex3f( 1.0f, 1.0f,-1.0f); // left of cube glNormal3f( -1.0f, 0.0f, 0.0f); glVertex3f(-1.0f, 1.0f, 1.0f); glVertex3f(-1.0f, 1.0f,-1.0f); glVertex3f(-1.0f,-1.0f,-1.0f); glVertex3f(-1.0f,-1.0f, 1.0f); // Right of cube glNormal3f( 1.0f, 0.0f, 0.0f); glVertex3f( 1.0f, 1.0f,-1.0f); glVertex3f( 1.0f, 1.0f, 1.0f); glVertex3f( 1.0f,-1.0f, 1.0f); glVertex3f( 1.0f,-1.0f,-1.0f); glEnd(); rtri+=2.0f; rquad-=1.0f; }
void addMonkeyResearchShipChangePosition(Ship *dockwith, Ship *ship,sdword dockindex) { DockStaticPoint *dockwithstaticpoint; vector coneheadingInWorldCoordSysDockWith,DockWithHeading,destination,DockWithUp,destinationoffset; vector desiredHeading,desiredUp,conepositionInWorldCoordSysDockWith,tmpvec; real32 theta; matrix rotmatrix,tmpmat; ResearchShipStatics *resstatics; resstatics = (ResearchShipStatics *) ((ShipStaticInfo *)(ship->staticinfo))->custstatinfo; dbgAssertOrIgnore(dockwith != NULL); //if we're calling this there should be another reserach station available somewhere if(ship->shiprace == R1) { dockwithstaticpoint = &dockwith->staticinfo->dockStaticInfo->dockstaticpoints[dockindex]; matMultiplyMatByVec(&coneheadingInWorldCoordSysDockWith,&dockwith->rotinfo.coordsys,&dockwithstaticpoint->conenormal); matGetVectFromMatrixCol3(DockWithHeading,dockwith->rotinfo.coordsys) destinationoffset.x = coneheadingInWorldCoordSysDockWith.x*resstatics->R1final_dock_distance; destinationoffset.y = coneheadingInWorldCoordSysDockWith.y*resstatics->R1final_dock_distance; destinationoffset.z = coneheadingInWorldCoordSysDockWith.z*resstatics->R1final_dock_distance; vecAdd(destination,dockwith->posinfo.position, destinationoffset); if(((ResearchShipSpec *)ship->ShipSpecifics)->pie_plate_num == 0) { //ship is docking on'a'top so add upwards factor matGetVectFromMatrixCol1(DockWithUp,dockwith->rotinfo.coordsys); vecScalarMultiply(DockWithUp,DockWithUp,resstatics->R1VerticalDockDistance); vecAdd(destination,destination,DockWithUp); } theta = DEG_TO_RAD(60); matMakeRotAboutX(&rotmatrix,(real32) cos(theta),(real32) sin(theta)); matMultiplyMatByMat(&tmpmat, &dockwith->rotinfo.coordsys, &rotmatrix); //share a lot of these things...later... ship->rotinfo.coordsys = tmpmat; ship->posinfo.position = destination; } else { //r2 positioning dockwithstaticpoint = &dockwith->staticinfo->dockStaticInfo->dockstaticpoints[dockindex]; matMultiplyMatByVec(&coneheadingInWorldCoordSysDockWith,&dockwith->rotinfo.coordsys,&dockwithstaticpoint->conenormal); matMultiplyMatByVec(&conepositionInWorldCoordSysDockWith,&dockwith->rotinfo.coordsys,&dockwithstaticpoint->position); vecAddTo(conepositionInWorldCoordSysDockWith,dockwith->posinfo.position); matGetVectFromMatrixCol3(DockWithHeading,dockwith->rotinfo.coordsys) destinationoffset.x = coneheadingInWorldCoordSysDockWith.x*resstatics->R2DockFinalDistance; destinationoffset.y = coneheadingInWorldCoordSysDockWith.y*resstatics->R2DockFinalDistance; destinationoffset.z = coneheadingInWorldCoordSysDockWith.z*resstatics->R2DockFinalDistance; vecAdd(destination,conepositionInWorldCoordSysDockWith, destinationoffset); desiredHeading = coneheadingInWorldCoordSysDockWith; if(dockindex == 0) { matGetVectFromMatrixCol3(desiredUp,dockwith->rotinfo.coordsys); } else if(dockindex == 1) { matGetVectFromMatrixCol3(desiredUp,dockwith->rotinfo.coordsys); } else if(dockindex == 2) { desiredUp = DockWithHeading; } else if(dockindex == 3) { theta = DEG_TO_RAD(60); matMakeRotAboutZ(&rotmatrix,(real32) cos(theta),(real32) sin(theta)); matMultiplyMatByMat(&tmpmat, &dockwith->rotinfo.coordsys, &rotmatrix); matGetVectFromMatrixCol1(desiredUp,tmpmat); } else if(dockindex == 4) { destinationoffset.x = coneheadingInWorldCoordSysDockWith.x*100; destinationoffset.y = coneheadingInWorldCoordSysDockWith.y*100; destinationoffset.z = coneheadingInWorldCoordSysDockWith.z*100; vecAdd(destination,conepositionInWorldCoordSysDockWith, destinationoffset); matGetVectFromMatrixCol1(desiredUp,dockwith->rotinfo.coordsys); vecScalarMultiply(desiredHeading,desiredHeading,-1.0f); } else { dbgAssertOrIgnore(FALSE); //shouldget here. } vecNormalize(&desiredUp); matPutVectIntoMatrixCol1(desiredUp,ship->rotinfo.coordsys); vecCrossProduct(tmpvec,desiredHeading,desiredUp); matPutVectIntoMatrixCol2(tmpvec,ship->rotinfo.coordsys); matPutVectIntoMatrixCol3(desiredHeading,ship->rotinfo.coordsys); ship->posinfo.position = destination; ship->posinfo.velocity.x = 0.0f; ship->posinfo.velocity.y = 0.0f; ship->posinfo.velocity.z = 0.0f; } }