diff options
| -rw-r--r-- | indra/llrender/llvertexbuffer.cpp | 1 | ||||
| -rw-r--r-- | indra/newview/llface.cpp | 13 | ||||
| -rw-r--r-- | indra/newview/llface.h | 2 | ||||
| -rw-r--r-- | indra/newview/llvosurfacepatch.cpp | 74 | 
4 files changed, 71 insertions, 19 deletions
| diff --git a/indra/llrender/llvertexbuffer.cpp b/indra/llrender/llvertexbuffer.cpp index 18f7557da9..7f14a8d5ac 100644 --- a/indra/llrender/llvertexbuffer.cpp +++ b/indra/llrender/llvertexbuffer.cpp @@ -1372,7 +1372,6 @@ void LLVertexBuffer::setupVertexBuffer(U32 data_mask) const  		llerrs << "LLVertexBuffer::setupVertexBuffer missing required components for supplied data mask." << llendl;  	} -  	if (data_mask & MAP_NORMAL)  	{  		glNormalPointer(GL_FLOAT, LLVertexBuffer::sTypeOffsets[TYPE_NORMAL], (void*)(base + mOffsets[TYPE_NORMAL])); diff --git a/indra/newview/llface.cpp b/indra/newview/llface.cpp index a65ee52fa1..679875e6bd 100644 --- a/indra/newview/llface.cpp +++ b/indra/newview/llface.cpp @@ -366,15 +366,18 @@ void LLFace::setDrawable(LLDrawable *drawable)  	mXform      = &drawable->mXform;  } -void LLFace::setSize(const S32 num_vertices, const S32 num_indices) +void LLFace::setSize(S32 num_vertices, S32 num_indices, bool align)  { -	//allocate vertices in blocks of 4 for alignment -	S32 num_verts = (num_vertices + 0x3) & ~0x3; +	if (align) +	{ +		//allocate vertices in blocks of 4 for alignment +		S32 num_vertices = (num_vertices + 0x3) & ~0x3; +	} -	if (mGeomCount != num_verts || +	if (mGeomCount != num_vertices ||  		mIndicesCount != num_indices)  	{ -		mGeomCount    = num_verts; +		mGeomCount    = num_vertices;  		mIndicesCount = num_indices;  		mVertexBuffer = NULL;  		mLastVertexBuffer = NULL; diff --git a/indra/newview/llface.h b/indra/newview/llface.h index f9e9c3e078..48909d7895 100644 --- a/indra/newview/llface.h +++ b/indra/newview/llface.h @@ -166,7 +166,7 @@ public:  	S32 getColors(LLStrider<LLColor4U> &colors);  	S32 getIndices(LLStrider<U16> &indices); -	void		setSize(const S32 numVertices, const S32 num_indices = 0); +	void		setSize(S32 numVertices, S32 num_indices = 0, bool align = false);  	BOOL		genVolumeBBoxes(const LLVolume &volume, S32 f,  								   const LLMatrix4& mat, const LLMatrix3& inv_trans_mat, BOOL global_volume = FALSE); diff --git a/indra/newview/llvosurfacepatch.cpp b/indra/newview/llvosurfacepatch.cpp index ef7b161003..eef62ddf1a 100644 --- a/indra/newview/llvosurfacepatch.cpp +++ b/indra/newview/llvosurfacepatch.cpp @@ -60,27 +60,77 @@ public:  		LLVertexBuffer(MAP_VERTEX | MAP_NORMAL | MAP_TEXCOORD0 | MAP_TEXCOORD1 | MAP_COLOR, GL_DYNAMIC_DRAW_ARB)  	{  		//texture coordinates 2 and 3 exist, but use the same data as texture coordinate 1 -		mOffsets[TYPE_TEXCOORD3] = mOffsets[TYPE_TEXCOORD2] = mOffsets[TYPE_TEXCOORD1]; -		mTypeMask |= MAP_TEXCOORD2 | MAP_TEXCOORD3;  	}; -	/*// virtual +	// virtual  	void setupVertexBuffer(U32 data_mask) const -	{		 -		if (LLDrawPoolTerrain::getDetailMode() == 0 || LLPipeline::sShadowRender) +	{	 +		U8* base = useVBOs() ? (U8*) mAlignedOffset : mMappedData; + +		//assume tex coords 2 and 3 are present +		U32 type_mask = mTypeMask | MAP_TEXCOORD2 | MAP_TEXCOORD3; + +		if ((data_mask & type_mask) != data_mask) +		{ +			llerrs << "LLVertexBuffer::setupVertexBuffer missing required components for supplied data mask." << llendl; +		} + +		if (data_mask & MAP_NORMAL) +		{ +			glNormalPointer(GL_FLOAT, LLVertexBuffer::sTypeOffsets[TYPE_NORMAL], (void*)(base + mOffsets[TYPE_NORMAL])); +		} +		if (data_mask & MAP_TEXCOORD3) +		{ //substitute tex coord 0 for tex coord 3 +			glClientActiveTextureARB(GL_TEXTURE3_ARB); +			glTexCoordPointer(2,GL_FLOAT, LLVertexBuffer::sTypeOffsets[TYPE_TEXCOORD0], (void*)(base + mOffsets[TYPE_TEXCOORD0])); +			glClientActiveTextureARB(GL_TEXTURE0_ARB); +		} +		if (data_mask & MAP_TEXCOORD2) +		{ //substitute tex coord 0 for tex coord 2 +			glClientActiveTextureARB(GL_TEXTURE2_ARB); +			glTexCoordPointer(2,GL_FLOAT, LLVertexBuffer::sTypeOffsets[TYPE_TEXCOORD0], (void*)(base + mOffsets[TYPE_TEXCOORD0])); +			glClientActiveTextureARB(GL_TEXTURE0_ARB); +		} +		if (data_mask & MAP_TEXCOORD1)  		{ -			LLVertexBuffer::setupVertexBuffer(data_mask); +			glClientActiveTextureARB(GL_TEXTURE1_ARB); +			glTexCoordPointer(2,GL_FLOAT, LLVertexBuffer::sTypeOffsets[TYPE_TEXCOORD1], (void*)(base + mOffsets[TYPE_TEXCOORD1])); +			glClientActiveTextureARB(GL_TEXTURE0_ARB);  		} -		else if (data_mask & LLVertexBuffer::MAP_TEXCOORD1) +		if (data_mask & MAP_BINORMAL)  		{ -			LLVertexBuffer::setupVertexBuffer(data_mask); +			glClientActiveTextureARB(GL_TEXTURE2_ARB); +			glTexCoordPointer(3,GL_FLOAT, LLVertexBuffer::sTypeOffsets[TYPE_BINORMAL], (void*)(base + mOffsets[TYPE_BINORMAL])); +			glClientActiveTextureARB(GL_TEXTURE0_ARB);  		} -		else +		if (data_mask & MAP_TEXCOORD0)  		{ -			LLVertexBuffer::setupVertexBuffer(data_mask); +			glTexCoordPointer(2,GL_FLOAT, LLVertexBuffer::sTypeOffsets[TYPE_TEXCOORD0], (void*)(base + mOffsets[TYPE_TEXCOORD0]));  		} -		llglassertok();		 -	}*/ +		if (data_mask & MAP_COLOR) +		{ +			glColorPointer(4, GL_UNSIGNED_BYTE, LLVertexBuffer::sTypeOffsets[TYPE_COLOR], (void*)(base + mOffsets[TYPE_COLOR])); +		} +		 +		if (data_mask & MAP_WEIGHT) +		{ +			glVertexAttribPointerARB(1, 1, GL_FLOAT, FALSE, LLVertexBuffer::sTypeOffsets[TYPE_WEIGHT], (void*)(base + mOffsets[TYPE_WEIGHT])); +		} + +		if (data_mask & MAP_WEIGHT4 && sWeight4Loc != -1) +		{ +			glVertexAttribPointerARB(sWeight4Loc, 4, GL_FLOAT, FALSE, LLVertexBuffer::sTypeOffsets[TYPE_WEIGHT4], (void*)(base+mOffsets[TYPE_WEIGHT4])); +		} + +		if (data_mask & MAP_CLOTHWEIGHT) +		{ +			glVertexAttribPointerARB(4, 4, GL_FLOAT, TRUE,  LLVertexBuffer::sTypeOffsets[TYPE_CLOTHWEIGHT], (void*)(base + mOffsets[TYPE_CLOTHWEIGHT])); +		} +		if (data_mask & MAP_VERTEX) +		{ +			glVertexPointer(3,GL_FLOAT, LLVertexBuffer::sTypeOffsets[TYPE_VERTEX], (void*)(base + 0)); +		} +	}  };  //============================================================================ | 
