vertexarray.cpp

来自「这是整套横扫千军3D版游戏的源码」· C++ 代码 · 共 261 行

CPP
261
字号
// VertexArray.cpp: implementation of the CVertexArrayRange class.
//
//////////////////////////////////////////////////////////////////////

#include "StdAfx.h"
#include "VertexArray.h"
#include "myGL.h"
#include "mmgr.h"

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

CVertexArray::CVertexArray()
{
	drawArray=SAFE_NEW float[1000];
	stripArray=SAFE_NEW int[100];

	drawArraySize=1000;
	stripArraySize=100;
}

CVertexArray::~CVertexArray()
{
	delete[] drawArray;
	delete[] stripArray;
}

void CVertexArray::Initialize()
{
	stripIndex=0;
	drawIndex=0;
}

bool CVertexArray::IsReady()
{
	return true; 
}

void CVertexArray::EndStrip()
{
	if(stripIndex>stripArraySize-4)
		EnlargeStripArray();

	stripArray[stripIndex++]=drawIndex;
}

void CVertexArray::AddVertex0(const float3& pos)
{
	if(drawIndex>drawArraySize-10)
		EnlargeDrawArray();

	drawArray[drawIndex++]=pos.x;
	drawArray[drawIndex++]=pos.y;
	drawArray[drawIndex++]=pos.z;
}

void CVertexArray::DrawArray0(int drawType,int stride)
{
	if(stripIndex==0 || stripArray[stripIndex-1]!=drawIndex)
		EndStrip();
	glVertexPointer(3,GL_FLOAT,stride,&drawArray[0]);
	glEnableClientState(GL_VERTEX_ARRAY);
	int oldIndex=0;
	for(int a=0;a<stripIndex;a++){
		glDrawArrays(drawType,oldIndex*4/stride,stripArray[a]*4/stride-oldIndex*4/stride);
		oldIndex=stripArray[a];
	}
	glDisableClientState(GL_VERTEX_ARRAY);						
}

void CVertexArray::AddVertexC(const float3& pos,unsigned char* color)
{
	if(drawIndex>drawArraySize-10)
		EnlargeDrawArray();

	drawArray[drawIndex++]=pos.x;
	drawArray[drawIndex++]=pos.y;
	drawArray[drawIndex++]=pos.z;
	drawArray[drawIndex++]=*((float*)(color));
}

void CVertexArray::DrawArrayC(int drawType,int stride)
{
	if(stripIndex==0 || stripArray[stripIndex-1]!=drawIndex)
		EndStrip();
	glVertexPointer(3,GL_FLOAT,stride,&drawArray[0]);
	glColorPointer(4,GL_UNSIGNED_BYTE,stride,&drawArray[3]);
	glEnableClientState(GL_VERTEX_ARRAY);
	glEnableClientState(GL_COLOR_ARRAY);
	int oldIndex=0;
	for(int a=0;a<stripIndex;a++){
		glDrawArrays(drawType,oldIndex*4/stride,stripArray[a]*4/stride-oldIndex*4/stride);
		oldIndex=stripArray[a];
	}
	glDisableClientState(GL_VERTEX_ARRAY);						
	glDisableClientState(GL_COLOR_ARRAY);
}

void CVertexArray::AddVertexT(const float3& pos,float tx,float ty)
{
	if(drawIndex>drawArraySize-10)
		EnlargeDrawArray();

	drawArray[drawIndex++]=pos.x;
	drawArray[drawIndex++]=pos.y;
	drawArray[drawIndex++]=pos.z;
	drawArray[drawIndex++]=tx;
	drawArray[drawIndex++]=ty;
}

void CVertexArray::DrawArrayT(int drawType,int stride)
{
	if(stripIndex==0 || stripArray[stripIndex-1]!=drawIndex)
		EndStrip();
	glVertexPointer(3,GL_FLOAT,stride,&drawArray[0]);
	glTexCoordPointer(2,GL_FLOAT,stride,&drawArray[3]);
	glEnableClientState(GL_TEXTURE_COORD_ARRAY);
	glEnableClientState(GL_VERTEX_ARRAY);
	int oldIndex=0;
	for(int a=0;a<stripIndex;a++){
		glDrawArrays(drawType,oldIndex*4/stride,stripArray[a]*4/stride-oldIndex*4/stride);
		oldIndex=stripArray[a];
	}
	glDisableClientState(GL_TEXTURE_COORD_ARRAY);
	glDisableClientState(GL_VERTEX_ARRAY);						
}

void CVertexArray::AddVertexT2(const float3& pos,float tx,float ty,float t2x,float t2y)
{
	if(drawIndex>drawArraySize-10)
		EnlargeDrawArray();

	drawArray[drawIndex++]=pos.x;
	drawArray[drawIndex++]=pos.y;
	drawArray[drawIndex++]=pos.z;
	drawArray[drawIndex++]=tx;
	drawArray[drawIndex++]=ty;
	drawArray[drawIndex++]=t2x;
	drawArray[drawIndex++]=t2y;
}

void CVertexArray::DrawArrayT2(int drawType,int stride)
{
	if(stripIndex==0 || stripArray[stripIndex-1]!=drawIndex)
		EndStrip();
	glVertexPointer(3,GL_FLOAT,stride,&drawArray[0]);
	glTexCoordPointer(2,GL_FLOAT,stride,&drawArray[3]);
	glEnableClientState(GL_TEXTURE_COORD_ARRAY);
	glEnableClientState(GL_VERTEX_ARRAY);

	glClientActiveTextureARB(GL_TEXTURE1_ARB);
	glTexCoordPointer(2,GL_FLOAT,stride,&drawArray[5]);
	glEnableClientState(GL_TEXTURE_COORD_ARRAY);
	glClientActiveTextureARB(GL_TEXTURE0_ARB);

	int oldIndex=0;
	for(int a=0;a<stripIndex;a++){
		glDrawArrays(drawType,oldIndex*4/stride,stripArray[a]*4/stride-oldIndex*4/stride);
		oldIndex=stripArray[a];
	}
	glClientActiveTextureARB(GL_TEXTURE1_ARB);
	glDisableClientState(GL_TEXTURE_COORD_ARRAY);
	glClientActiveTextureARB(GL_TEXTURE0_ARB);

	glDisableClientState(GL_TEXTURE_COORD_ARRAY);
	glDisableClientState(GL_VERTEX_ARRAY);						
}

void CVertexArray::AddVertexTN(const float3& pos,float tx,float ty, const float3& norm)
{
	if(drawIndex>drawArraySize-10)
		EnlargeDrawArray();

	drawArray[drawIndex++]=pos.x;
	drawArray[drawIndex++]=pos.y;
	drawArray[drawIndex++]=pos.z;
	drawArray[drawIndex++]=tx;
	drawArray[drawIndex++]=ty;
	drawArray[drawIndex++]=norm.x;
	drawArray[drawIndex++]=norm.y;
	drawArray[drawIndex++]=norm.z;
}

void CVertexArray::DrawArrayTN(int drawType, int stride)
{
	if(stripIndex==0 || stripArray[stripIndex-1]!=drawIndex)
		EndStrip();
	glVertexPointer(3,GL_FLOAT,stride,&drawArray[0]);
	glTexCoordPointer(2,GL_FLOAT,stride,&drawArray[3]);
	glNormalPointer(GL_FLOAT,stride,&drawArray[5]);
	glEnableClientState(GL_TEXTURE_COORD_ARRAY);
	glEnableClientState(GL_VERTEX_ARRAY);
	glEnableClientState(GL_NORMAL_ARRAY);
	
	int oldIndex=0;
	for(int a=0;a<stripIndex;a++){
		glDrawArrays(drawType,oldIndex*4/stride,stripArray[a]*4/stride-oldIndex*4/stride);
		oldIndex=stripArray[a];
	}
	glDisableClientState(GL_TEXTURE_COORD_ARRAY);
	glDisableClientState(GL_VERTEX_ARRAY);						
	glDisableClientState(GL_NORMAL_ARRAY);
}

void CVertexArray::AddVertexTC(const float3& pos,float tx,float ty,unsigned char* col)
{
	if(drawIndex>drawArraySize-10)
		EnlargeDrawArray();

	drawArray[drawIndex++]=pos.x;
	drawArray[drawIndex++]=pos.y;
	drawArray[drawIndex++]=pos.z;
	drawArray[drawIndex++]=tx;
	drawArray[drawIndex++]=ty;
	drawArray[drawIndex++]=*((float*)(col));
}

void CVertexArray::DrawArrayTC(int drawType, int stride)
{
	if(stripIndex==0 || stripArray[stripIndex-1]!=drawIndex)
		EndStrip();
	glVertexPointer(3,GL_FLOAT,stride,&drawArray[0]);
	glTexCoordPointer(2,GL_FLOAT,stride,&drawArray[3]);
	glColorPointer(4,GL_UNSIGNED_BYTE,stride,&drawArray[5]);
	glEnableClientState(GL_TEXTURE_COORD_ARRAY);
	glEnableClientState(GL_VERTEX_ARRAY);
	glEnableClientState(GL_COLOR_ARRAY);
	
	int oldIndex=0;
	for(int a=0;a<stripIndex;a++){
		glDrawArrays(drawType,oldIndex*4/stride,stripArray[a]*4/stride-oldIndex*4/stride);
		oldIndex=stripArray[a];
	}
	glDisableClientState(GL_TEXTURE_COORD_ARRAY);
	glDisableClientState(GL_VERTEX_ARRAY);						
	glDisableClientState(GL_COLOR_ARRAY);
}

void CVertexArray::EnlargeDrawArray()
{
	float* tempArray=SAFE_NEW float[drawArraySize*2];
	for(int a=0;a<drawIndex;++a)
		tempArray[a]=drawArray[a];

	drawArraySize*=2;
	delete[] drawArray;
	drawArray=tempArray;
}

void CVertexArray::EnlargeStripArray()
{
	int* tempArray=SAFE_NEW int[stripArraySize*2];
	for(int a=0;a<stripIndex;++a)
		tempArray[a]=stripArray[a];

	stripArraySize*=2;
	delete[] stripArray;
	stripArray=tempArray;
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?