コード例 #1
0
ファイル: wzmutils.c プロジェクト: ArtemusRus/warzone2100
static inline void drawMesh(MODEL *psModel, int now, int mesh)
{
	MESH *psMesh = &psModel->mesh[mesh];

	assert(psMesh);
	if (psMesh->frameArray)
	{
		FRAME *psFrame = &psMesh->frameArray[psMesh->currentFrame];
		FRAME *nextFrame = psFrame;
		double fraction = 1.0f / (psFrame->timeSlice * 1000) * (now - psMesh->lastChange); // until next frame
		Vector3f vec;

		glPushMatrix();	// save matrix state

		assert(psMesh->currentFrame < psMesh->frames);

		if (psMesh->currentFrame == psMesh->frames - 1)
		{
			nextFrame = &psMesh->frameArray[0];	// wrap around
		}
		else
		{
			nextFrame = &psMesh->frameArray[psMesh->currentFrame + 1];
		}

		// Try to avoid crap drivers from taking down the entire system
		assert(finitef(psFrame->translation.x) && finitef(psFrame->translation.y) && finitef(psFrame->translation.z));
		assert(psFrame->rotation.x >= -360.0f && psFrame->rotation.y >= -360.0f && psFrame->rotation.z >= -360.0f);
		assert(psFrame->rotation.x <= 360.0f && psFrame->rotation.y <= 360.0f && psFrame->rotation.z <= 360.0f);

		// Translate
		interpolateVectors(psFrame->translation, nextFrame->translation, &vec, fraction);
		glTranslatef(vec.x, vec.z, vec.y);	// z and y flipped

		// Rotate
		interpolateVectors(psFrame->rotation, nextFrame->rotation, &vec, fraction);
		glRotatef(vec.x, 1, 0, 0);
		glRotatef(vec.z, 0, 1, 0);	// z and y flipped again...
		glRotatef(vec.y, 0, 0, 1);

		// Morph
		if (!psMesh->teamColours)
		{
			psMesh->currentTextureArray = psFrame->textureArray;
		}
	}

	glTexCoordPointer(2, GL_FLOAT, 0, psMesh->textureArray[psMesh->currentTextureArray]);
	glVertexPointer(3, GL_FLOAT, 0, psMesh->vertexArray);

	glDrawElements(GL_TRIANGLES, psMesh->faces * 3, GL_UNSIGNED_INT, psMesh->indexArray);
	if (psMesh->frameArray)
	{
		glPopMatrix();	// restore position for next mesh
	}
}
コード例 #2
0
ファイル: bkgl.cpp プロジェクト: bkingery/cs455
Point bkgl::interpolatePoint(int x, int y, Point p1, Point p2, float distance)
{
  Color c = colorInterpolation(p1.getColor(), p2.getColor(), distance);
  float z = zInterpolation(p1.z, p2.z, distance);
  
  cml::vector4f world = interpolateVectors(p1.world, p2.world, distance);
  Normal normal = interpolateVectors(p1.normal, p2.normal, distance);
  
  return Point(x, y, z, 0, c, world, normal);
}