Pull in vertex buffer changes from alch.
This commit is contained in:
@@ -607,7 +607,7 @@ void LLFace::renderSelected(LLViewerTexture *imagep, const LLColor4& color)
|
||||
|
||||
gGL.diffuseColor4fv(color.mV);
|
||||
|
||||
LLVertexBuffer::drawElements(LLRender::TRIANGLES, vol_face.mPositions, vol_face.mTexCoords, vol_face.mNumIndices, vol_face.mIndices);
|
||||
LLVertexBuffer::drawElements(LLRender::TRIANGLES, vol_face.mNumVertices, vol_face.mPositions, vol_face.mTexCoords, vol_face.mNumIndices, vol_face.mIndices);
|
||||
|
||||
if(prev_shader)
|
||||
{
|
||||
@@ -1439,152 +1439,6 @@ BOOL LLFace::getGeometryVolume(const LLVolume& volume,
|
||||
}
|
||||
|
||||
static LLCachedControl<bool> use_transform_feedback("RenderUseTransformFeedback", false);
|
||||
|
||||
#ifdef GL_TRANSFORM_FEEDBACK_BUFFER
|
||||
if (use_transform_feedback &&
|
||||
gTransformPositionProgram.mProgramObject && //transform shaders are loaded
|
||||
mVertexBuffer->useVBOs() && //target buffer is in VRAM
|
||||
!rebuild_weights && //TODO: add support for weights
|
||||
!volume.isUnique()) //source volume is NOT flexi
|
||||
{ //use transform feedback to pack vertex buffer
|
||||
LL_RECORD_BLOCK_TIME(FTM_FACE_GEOM_FEEDBACK);
|
||||
LLGLEnable discard(GL_RASTERIZER_DISCARD);
|
||||
LLVertexBuffer* buff = (LLVertexBuffer*) vf.mVertexBuffer.get();
|
||||
|
||||
if (vf.mVertexBuffer.isNull() || buff->getNumVerts() != vf.mNumVertices)
|
||||
{
|
||||
mVObjp->getVolume()->genTangents(f);
|
||||
LLFace::cacheFaceInVRAM(vf);
|
||||
buff = (LLVertexBuffer*) vf.mVertexBuffer.get();
|
||||
}
|
||||
|
||||
LLGLSLShader* cur_shader = LLGLSLShader::sCurBoundShaderPtr;
|
||||
|
||||
gGL.pushMatrix();
|
||||
gGL.loadMatrix(mat_vert_in);
|
||||
|
||||
if (rebuild_pos)
|
||||
{
|
||||
LL_RECORD_BLOCK_TIME(FTM_FACE_GEOM_FEEDBACK_POSITION);
|
||||
gTransformPositionProgram.bind();
|
||||
|
||||
mVertexBuffer->bindForFeedback(0, LLVertexBuffer::TYPE_VERTEX, mGeomIndex, mGeomCount);
|
||||
|
||||
U8 index = mTextureIndex < 255 ? mTextureIndex : 0;
|
||||
|
||||
S32 val = 0;
|
||||
U8* vp = (U8*) &val;
|
||||
vp[0] = index;
|
||||
vp[1] = 0;
|
||||
vp[2] = 0;
|
||||
vp[3] = 0;
|
||||
|
||||
gTransformPositionProgram.uniform1i(sTextureIndexIn, val);
|
||||
glBeginTransformFeedback(GL_POINTS);
|
||||
buff->setBuffer(LLVertexBuffer::MAP_VERTEX);
|
||||
|
||||
push_for_transform(buff, vf.mNumVertices, mGeomCount);
|
||||
|
||||
glEndTransformFeedback();
|
||||
}
|
||||
|
||||
if (rebuild_color)
|
||||
{
|
||||
LL_RECORD_BLOCK_TIME(FTM_FACE_GEOM_FEEDBACK_COLOR);
|
||||
gTransformColorProgram.bind();
|
||||
|
||||
mVertexBuffer->bindForFeedback(0, LLVertexBuffer::TYPE_COLOR, mGeomIndex, mGeomCount);
|
||||
|
||||
S32 val = *((S32*) color.mV);
|
||||
|
||||
gTransformColorProgram.uniform1i(sColorIn, val);
|
||||
glBeginTransformFeedback(GL_POINTS);
|
||||
buff->setBuffer(LLVertexBuffer::MAP_VERTEX);
|
||||
push_for_transform(buff, vf.mNumVertices, mGeomCount);
|
||||
glEndTransformFeedback();
|
||||
}
|
||||
|
||||
if (rebuild_emissive)
|
||||
{
|
||||
LL_RECORD_BLOCK_TIME(FTM_FACE_GEOM_FEEDBACK_EMISSIVE);
|
||||
gTransformColorProgram.bind();
|
||||
|
||||
mVertexBuffer->bindForFeedback(0, LLVertexBuffer::TYPE_EMISSIVE, mGeomIndex, mGeomCount);
|
||||
|
||||
U8 glow = (U8) llclamp((S32) (getTextureEntry()->getGlow()*255), 0, 255);
|
||||
|
||||
S32 glow32 = glow |
|
||||
(glow << 8) |
|
||||
(glow << 16) |
|
||||
(glow << 24);
|
||||
|
||||
gTransformColorProgram.uniform1i(sColorIn, glow32);
|
||||
glBeginTransformFeedback(GL_POINTS);
|
||||
buff->setBuffer(LLVertexBuffer::MAP_VERTEX);
|
||||
push_for_transform(buff, vf.mNumVertices, mGeomCount);
|
||||
glEndTransformFeedback();
|
||||
}
|
||||
|
||||
if (rebuild_normal)
|
||||
{
|
||||
LL_RECORD_BLOCK_TIME(FTM_FACE_GEOM_FEEDBACK_NORMAL);
|
||||
gTransformNormalProgram.bind();
|
||||
|
||||
mVertexBuffer->bindForFeedback(0, LLVertexBuffer::TYPE_NORMAL, mGeomIndex, mGeomCount);
|
||||
|
||||
glBeginTransformFeedback(GL_POINTS);
|
||||
buff->setBuffer(LLVertexBuffer::MAP_NORMAL);
|
||||
push_for_transform(buff, vf.mNumVertices, mGeomCount);
|
||||
glEndTransformFeedback();
|
||||
}
|
||||
|
||||
if (rebuild_tangent)
|
||||
{
|
||||
LL_RECORD_BLOCK_TIME(FTM_FACE_GEOM_TANGENT);
|
||||
gTransformTangentProgram.bind();
|
||||
|
||||
mVertexBuffer->bindForFeedback(0, LLVertexBuffer::TYPE_TANGENT, mGeomIndex, mGeomCount);
|
||||
|
||||
glBeginTransformFeedback(GL_POINTS);
|
||||
buff->setBuffer(LLVertexBuffer::MAP_TANGENT);
|
||||
push_for_transform(buff, vf.mNumVertices, mGeomCount);
|
||||
glEndTransformFeedback();
|
||||
}
|
||||
|
||||
if (rebuild_tcoord)
|
||||
{
|
||||
LL_RECORD_BLOCK_TIME(FTM_FACE_GEOM_FEEDBACK_TEXTURE);
|
||||
gTransformTexCoordProgram.bind();
|
||||
|
||||
mVertexBuffer->bindForFeedback(0, LLVertexBuffer::TYPE_TEXCOORD0, mGeomIndex, mGeomCount);
|
||||
|
||||
glBeginTransformFeedback(GL_POINTS);
|
||||
buff->setBuffer(LLVertexBuffer::MAP_TEXCOORD0);
|
||||
push_for_transform(buff, vf.mNumVertices, mGeomCount);
|
||||
glEndTransformFeedback();
|
||||
|
||||
bool do_bump = bump_code && mVertexBuffer->hasDataType(LLVertexBuffer::TYPE_TEXCOORD1);
|
||||
|
||||
if (do_bump)
|
||||
{
|
||||
mVertexBuffer->bindForFeedback(0, LLVertexBuffer::TYPE_TEXCOORD1, mGeomIndex, mGeomCount);
|
||||
glBeginTransformFeedback(GL_POINTS);
|
||||
buff->setBuffer(LLVertexBuffer::MAP_TEXCOORD0);
|
||||
push_for_transform(buff, vf.mNumVertices, mGeomCount);
|
||||
glEndTransformFeedback();
|
||||
}
|
||||
}
|
||||
|
||||
glBindBufferARB(GL_TRANSFORM_FEEDBACK_BUFFER, 0);
|
||||
gGL.popMatrix();
|
||||
|
||||
if (cur_shader)
|
||||
{
|
||||
cur_shader->bind();
|
||||
}
|
||||
}
|
||||
else
|
||||
#endif
|
||||
{
|
||||
//if it's not fullbright and has no normals, bake sunlight based on face normal
|
||||
//bool bake_sunlight = !getTextureEntry()->getFullbright() &&
|
||||
|
||||
Reference in New Issue
Block a user