Ejemplo n.º 1
0
void
grCustomizePits(void)
{
	tTrackPitInfo *pits;
	int i;
	tdble x, y;
	tdble x2, y2, z2;
	
	ThePits = new ssgBranch();
	PitsAnchor->addKid(ThePits);
	
	pits = &(grTrack->pits);
	/* draw the pit identification */
	
	switch (pits->type) {
	case TR_PIT_ON_TRACK_SIDE:
		for (i = 0; i < pits->nMaxPits; i++) {
			char buf[256];
			t3Dd normalvector;
			sgVec3 vtx;
			sgVec4 clr = {0,0,0,1};
			sgVec3 nrm;
			sgVec2 tex;
			ssgState *st;
			ssgVertexArray *pit_vtx = new ssgVertexArray(4);
			ssgTexCoordArray *pit_tex = new ssgTexCoordArray(4);
			ssgColourArray *pit_clr = new ssgColourArray(1);
			ssgNormalArray *pit_nrm = new ssgNormalArray(1);
			
			pit_clr->add(clr);
		
			if (pits->driversPits[i].car[0]) {
				// If we have more than one car in the pit use the team pit logo of driver 0. 
				if (pits->driversPits[i].freeCarIndex == 1) { 
					// One car assigned to the pit.
					sprintf(buf, "drivers/%s/%d;drivers/%s;data/textures;data/img;.",
						pits->driversPits[i].car[0]->_modName, pits->driversPits[i].car[0]->_driverIndex,
						pits->driversPits[i].car[0]->_modName);
				} else {
					// Multiple cars assigned to the pit.
					sprintf(buf, "drivers/%s;data/textures;data/img;.", pits->driversPits[i].car[0]->_modName);
				}
			} else {
				sprintf(buf, "data/textures;data/img;.");
			}
			
			
			st = grSsgLoadTexStateEx("logo.rgb", buf, FALSE, FALSE);
			((ssgSimpleState*)st)->setShininess(50);
			
			RtTrackLocal2Global(&(pits->driversPits[i].pos), &x, &y, pits->driversPits[i].pos.type);
			RtTrackSideNormalG(pits->driversPits[i].pos.seg, x, y, pits->side, &normalvector);
			x2 = x - pits->width/2.0 * normalvector.x + pits->len/2.0 * normalvector.y;
			y2 = y - pits->width/2.0 * normalvector.y - pits->len/2.0 * normalvector.x;
			z2 = RtTrackHeightG(pits->driversPits[i].pos.seg, x2, y2);
		
			nrm[0] = normalvector.x;
			nrm[1] = normalvector.y;
			nrm[2] = 0;
			pit_nrm->add(nrm);
		
			tex[0] = -0.7;
			tex[1] = 0.33;
			vtx[0] = x2;
			vtx[1] = y2;
			vtx[2] = z2;
			pit_tex->add(tex);
			pit_vtx->add(vtx);
			
			tex[0] = -0.7;
			tex[1] = 1.1;
			vtx[0] = x2;
			vtx[1] = y2;
			vtx[2] = z2 + 4.8;
			pit_tex->add(tex);
			pit_vtx->add(vtx);
			
			x2 = x - pits->width/2.0 * normalvector.x - pits->len/2.0 * normalvector.y;
			y2 = y - pits->width/2.0 * normalvector.y + pits->len/2.0 * normalvector.x;
			z2 = RtTrackHeightG(pits->driversPits[i].pos.seg, x2, y2);
		
			tex[0] = 1.3;
			tex[1] = 0.33;
			vtx[0] = x2;
			vtx[1] = y2;
			vtx[2] = z2;
			pit_tex->add(tex);
			pit_vtx->add(vtx);
			
			tex[0] = 1.3;
			tex[1] = 1.1;
			vtx[0] = x2;
			vtx[1] = y2;
			vtx[2] = z2 + 4.8;
			pit_tex->add(tex);
			pit_vtx->add(vtx);
		
			ssgVtxTable *pit = new ssgVtxTable(GL_TRIANGLE_STRIP, pit_vtx, pit_nrm, pit_tex, pit_clr);
			pit->setState(st);
			pit->setCullFace(0);
			ThePits->addKid(pit);
		}
	break;
	case TR_PIT_ON_SEPARATE_PATH:
	break;
	case TR_PIT_NONE:
	break;	
	}
}
Ejemplo n.º 2
0
void grInitSmoke(int index)
{
    char buf[256];

    grSmokeMaxNumber = (int)GfParmGetNum(grHandle, GR_SCT_GRAPHIC, GR_ATT_SMOKENB,
										 (char*)NULL, MAX_SMOKE_NUMBER);
    grSmokeDeltaT = (double)GfParmGetNum(grHandle, GR_SCT_GRAPHIC, GR_ATT_SMOKEDELTAT,
										 (char*)NULL, DELTAT);
    grSmokeLife = (double)GfParmGetNum(grHandle, GR_SCT_GRAPHIC, GR_ATT_SMOKEDLIFE,
									   (char*)NULL, MAX_SMOKE_LIFE);

    if (!grSmokeMaxNumber) {
		return;
    }

    grFireDeltaT=grSmokeDeltaT*8;

    if (!timeSmoke) {
		timeSmoke = (double *) malloc(sizeof(double)*index*4);
		memset(timeSmoke,0,sizeof(double)*index*4);
    }

    if (!timeFire) {
		timeFire = (double *) malloc(sizeof(double)*index);
		memset(timeFire,0,sizeof(double)*index);
    }

    if (!smokeManager) {
		smokeManager = (tgrSmokeManager*) malloc(sizeof(tgrSmokeManager));
		smokeManager->smokeList = NULL;
		smokeManager->number = 0;
    }

    // add temp object to get a reference on the states
    if (!mst) {
		sprintf(buf, "data/textures;data/img;.");
		mst = (ssgSimpleState*)grSsgLoadTexStateEx("smoke.rgb", buf, FALSE, FALSE);
		if (mst!=NULL) {
			mst->disable(GL_LIGHTING);
			mst->enable(GL_BLEND);
			mst->disable(GL_CULL_FACE);
			mst->setTranslucent();
			mst->setColourMaterial(GL_AMBIENT_AND_DIFFUSE);
		}
    }

    if (!mstf0) {
		sprintf(buf, "data/textures;data/img;.");
		mstf0 = (ssgSimpleState*)grSsgLoadTexStateEx("fire0.rgb", buf, FALSE, FALSE);
		if (mst!=NULL) {
			mstf0->disable(GL_LIGHTING);
			mstf0->enable(GL_BLEND);
			mstf0->disable(GL_CULL_FACE);
			mstf0->setTranslucent();
			mstf0->setColourMaterial(GL_AMBIENT_AND_DIFFUSE);
		}
    }

    if (!mstf1) {
		sprintf(buf, "data/textures;data/img;.");
		mstf1 = (ssgSimpleState*)grSsgLoadTexStateEx("fire1.rgb", buf, FALSE, FALSE);
		if (mst!=NULL) {
			mstf1->disable(GL_LIGHTING);
			mstf1->enable(GL_BLEND);
			mstf1->disable(GL_CULL_FACE);
			mstf1->setTranslucent();
			mstf1->setColourMaterial(GL_AMBIENT_AND_DIFFUSE);
		}
    }
}
Ejemplo n.º 3
0
void grInitCarlight(int index)
{
	char buf[256];
	int i = 0;
	theCarslight = (tgrCarlight *)malloc(sizeof(tgrCarlight)*index);
	memset(theCarslight, 0, sizeof(tgrCarlight)*index);

	for (i = 0; i < index; i++) {
		theCarslight[i].lightAnchor= new ssgBranch();
	}

	sprintf(buf, "data/textures;data/img;.");
	
	if (!frontlight1) {
		frontlight1 = (ssgSimpleState*)grSsgLoadTexStateEx("frontlight1.png", buf, FALSE, FALSE);
		if (frontlight1) {
			frontlight1->disable(GL_LIGHTING);
			frontlight1->enable(GL_BLEND);
			frontlight1->disable(GL_CULL_FACE);
			frontlight1->setTranslucent();
			frontlight1->setColourMaterial(GL_AMBIENT_AND_DIFFUSE);
		}
	}

	if (!frontlight2) {
		frontlight2 = (ssgSimpleState*)grSsgLoadTexStateEx("frontlight2.png", buf, FALSE, FALSE);
		if (frontlight2) {
			frontlight2->disable(GL_LIGHTING);
			frontlight2->enable(GL_BLEND);
			frontlight2->disable(GL_CULL_FACE);
			frontlight2->setTranslucent();
			frontlight2->setColourMaterial(GL_AMBIENT_AND_DIFFUSE);
		}
	}

	if (!rearlight1) {
		rearlight1 = (ssgSimpleState*)grSsgLoadTexStateEx("rearlight1.png", buf, FALSE, FALSE);
		if (rearlight1) {
			rearlight1->disable(GL_LIGHTING);
			rearlight1->enable(GL_BLEND);
			rearlight1->disable(GL_CULL_FACE);
			rearlight1->setTranslucent();
			rearlight1->setColourMaterial(GL_AMBIENT_AND_DIFFUSE);
		}
	}

	if (!rearlight2) {
		rearlight2 = (ssgSimpleState*)grSsgLoadTexStateEx("rearlight2.png", buf, FALSE, FALSE);
		if (rearlight2) {
			rearlight2->disable(GL_LIGHTING);
			rearlight2->enable(GL_BLEND);
			rearlight2->disable(GL_CULL_FACE);
			rearlight2->setTranslucent();
			rearlight2->setColourMaterial(GL_AMBIENT_AND_DIFFUSE);
		}
	}

	if (!breaklight1) {
		breaklight1 = (ssgSimpleState*)grSsgLoadTexStateEx("breaklight1.png", buf, FALSE, FALSE);
		if (breaklight1) {
			breaklight1->disable(GL_LIGHTING);
			breaklight1->enable(GL_BLEND);
			breaklight1->disable(GL_CULL_FACE);
			breaklight1->setTranslucent();
			breaklight1->setColourMaterial(GL_AMBIENT_AND_DIFFUSE);
		}
	}

	if (!breaklight2) {
		breaklight2 = (ssgSimpleState*)grSsgLoadTexStateEx("breaklight2.png", buf, FALSE, FALSE);
		if (breaklight2) {
			breaklight2->disable(GL_LIGHTING);
			breaklight2->enable(GL_BLEND);
			breaklight2->disable(GL_CULL_FACE);
			breaklight2->setTranslucent();
			breaklight2->setColourMaterial(GL_AMBIENT_AND_DIFFUSE);
		}
	}

	CarlightCleanupAnchor = new ssgBranch();
}