diff options
author | Graham Madarasz <graham@lindenlab.com> | 2013-04-26 13:13:55 -0700 |
---|---|---|
committer | Graham Madarasz <graham@lindenlab.com> | 2013-04-26 13:13:55 -0700 |
commit | ced83c5248f2be664bd95adacfbede912f00697f (patch) | |
tree | 71ec014cda15bc328f632c43c04f7518c3a180c3 /indra | |
parent | 94b7597576fd4fcec6160ad88b2e832c9486b17f (diff) | |
parent | 243c7bd06441af0c286d71d6ff0b7d488285bc1c (diff) |
Merge vwr-dev-mat
Diffstat (limited to 'indra')
6 files changed, 137 insertions, 308 deletions
diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml index ff3faaf92c..c064b420f3 100755 --- a/indra/newview/app_settings/settings.xml +++ b/indra/newview/app_settings/settings.xml @@ -291,17 +291,6 @@ <key>Value</key> <real>1.0</real> </map> - <key>AudioLevelUnderwaterRolloff</key> - <map> - <key>Comment</key> - <string>Controls the distance-based dropoff of audio volume underwater(fraction or multiple of default audio rolloff)</string> - <key>Persist</key> - <integer>1</integer> - <key>Type</key> - <string>F32</string> - <key>Value</key> - <real>5.0</real> - </map> <key>AudioLevelSFX</key> <map> <key>Comment</key> @@ -2015,39 +2004,6 @@ <key>Value</key> <string /> </map> - <key>DebugAvatarAppearanceMessage</key> - <map> - <key>Comment</key> - <string>Dump a bunch of XML files when handling appearance messages</string> - <key>Persist</key> - <integer>1</integer> - <key>Type</key> - <string>Boolean</string> - <key>Value</key> - <integer>0</integer> - </map> - <key>DebugAvatarExperimentalServerAppearanceUpdate</key> - <map> - <key>Comment</key> - <string>Experiment with sending full cof_contents instead of cof_version</string> - <key>Persist</key> - <integer>1</integer> - <key>Type</key> - <string>Boolean</string> - <key>Value</key> - <integer>0</integer> - </map> - <key>DebugAvatarAppearanceServiceURLOverride</key> - <map> - <key>Comment</key> - <string>URL to use for baked texture requests; overrides value returned by login server.</string> - <key>Persist</key> - <integer>1</integer> - <key>Type</key> - <string>String</string> - <key>Value</key> - <string /> - </map> <key>DebugAvatarRezTime</key> <map> <key>Comment</key> @@ -2070,17 +2026,6 @@ <key>Value</key> <integer>1</integer> </map> - <key>DebugAvatarCompositeBaked</key> - <map> - <key>Comment</key> - <string>Colorize avatar meshes based on baked/composite state.</string> - <key>Persist</key> - <integer>1</integer> - <key>Type</key> - <string>Boolean</string> - <key>Value</key> - <integer>0</integer> - </map> <key>DebugBeaconLineWidth</key> <map> <key>Comment</key> @@ -2092,17 +2037,6 @@ <key>Value</key> <integer>1</integer> </map> - <key>DebugForceAppearanceRequestFailure</key> - <map> - <key>Comment</key> - <string>Request wrong cof version to test the failure path for server appearance update requests.</string> - <key>Persist</key> - <integer>1</integer> - <key>Type</key> - <string>Boolean</string> - <key>Value</key> - <integer>0</integer> - </map> <key>DebugHideEmptySystemFolders</key> <map> <key>Comment</key> @@ -4436,28 +4370,6 @@ <key>Value</key> <real>1.0</real> </map> - <key>InventoryDebugSimulateOpFailureRate</key> - <map> - <key>Comment</key> - <string>Rate at which we simulate failures of copy/link requests in some operations</string> - <key>Persist</key> - <integer>1</integer> - <key>Type</key> - <string>F32</string> - <key>Value</key> - <real>0.0</real> - </map> - <key>InventoryDebugSimulateLateOpRate</key> - <map> - <key>Comment</key> - <string>Rate at which we simulate late-completing copy/link requests in some operations</string> - <key>Persist</key> - <integer>1</integer> - <key>Type</key> - <string>F32</string> - <key>Value</key> - <real>0.0</real> - </map> <key>InventoryDisplayInbox</key> <map> <key>Comment</key> @@ -8559,7 +8471,7 @@ <key>Type</key> <string>U32</string> <key>Value</key> - <real>512</real> + <real>1024</real> </map> <key>RenderSpecularResY</key> @@ -8571,7 +8483,7 @@ <key>Type</key> <string>U32</string> <key>Value</key> - <real>128</real> + <real>256</real> </map> <key>RenderSpecularExponent</key> @@ -8980,28 +8892,6 @@ <key>Value</key> <integer>1</integer> </map> - <key>DisableAllRenderTypes</key> - <map> - <key>Comment</key> - <string>Disables all rendering types.</string> - <key>Persist</key> - <integer>0</integer> - <key>Type</key> - <string>Boolean</string> - <key>Value</key> - <integer>0</integer> - </map> - <key>DisableAllRenderFeatures</key> - <map> - <key>Comment</key> - <string>Disables all rendering features.</string> - <key>Persist</key> - <integer>0</integer> - <key>Type</key> - <string>Boolean</string> - <key>Value</key> - <integer>0</integer> - </map> <key>RenderHUDInSnapshot</key> <map> <key>Comment</key> @@ -13439,28 +13329,6 @@ <key>Value</key> <integer>-1</integer> </map> - <key>MaxFPS</key> - <map> - <key>Comment</key> - <string>Yield some time to the local host if we reach a threshold framerate.</string> - <key>Persist</key> - <integer>1</integer> - <key>Type</key> - <string>F32</string> - <key>Value</key> - <integer>-1.0</integer> - </map> - <key>ForcePeriodicRenderingTime</key> - <map> - <key>Comment</key> - <string>Periodically enable all rendering masks for a single frame.</string> - <key>Persist</key> - <integer>1</integer> - <key>Type</key> - <string>F32</string> - <key>Value</key> - <integer>-1.0</integer> - </map> <key>ZoomDirect</key> <map> <key>Comment</key> @@ -14446,60 +14314,5 @@ <key>Value</key> <integer>0</integer> </map> - <key>DisablePrecacheDelayAfterTeleporting</key> - <map> - <key>Comment</key> - <string>Disables the artificial delay in the viewer that precaches some incoming assets</string> - <key>Persist</key> - <integer>0</integer> - <key>Type</key> - <string>Boolean</string> - <key>Value</key> - <integer>0</integer> - </map> - <key>FMODExProfilerEnable</key> - <map> - <key>Comment</key> - <string>Enable profiler tool if using FMOD Ex</string> - <key>Persist</key> - <integer>1</integer> - <key>Type</key> - <string>Boolean</string> - <key>Value</key> - <integer>0</integer> - </map> - <key>FMODExDecodeBufferSize</key> - <map> - <key>Comment</key> - <string>Sets the streaming decode buffer size (in milliseconds)</string> - <key>Persist</key> - <integer>1</integer> - <key>Type</key> - <string>U32</string> - <key>Value</key> - <integer>1000</integer> - </map> - <key>FMODExStreamBufferSize</key> - <map> - <key>Comment</key> - <string>Sets the streaming buffer size (in milliseconds)</string> - <key>Persist</key> - <integer>1</integer> - <key>Type</key> - <string>U32</string> - <key>Value</key> - <integer>7000</integer> - </map> - <key>DisablePrecacheDelayAfterTeleporting</key> - <map> - <key>Comment</key> - <string>Disables the artificial delay in the viewer that precaches some incoming assets</string> - <key>Persist</key> - <integer>0</integer> - <key>Type</key> - <string>Boolean</string> - <key>Value</key> - <integer>0</integer> - </map> </map> </llsd> diff --git a/indra/newview/app_settings/shaders/class1/deferred/skyF.glsl b/indra/newview/app_settings/shaders/class1/deferred/skyF.glsl index 20a756530a..49ad064364 100755 --- a/indra/newview/app_settings/shaders/class1/deferred/skyF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/skyF.glsl @@ -61,6 +61,6 @@ void main() /// Gamma correct for WL (soft clip effect). frag_data[0] = vec4(scaleSoftClip(color.rgb), 1.0); frag_data[1] = vec4(0.0,0.0,0.0,0.0); - frag_data[2] = vec4(0.5,0.5,0.5,0); + frag_data[2] = vec4(0.5,0.5,0.0,0); } diff --git a/indra/newview/app_settings/shaders/class1/deferred/softenLightF.glsl b/indra/newview/app_settings/shaders/class1/deferred/softenLightF.glsl index aafa932b8f..90cf085524 100755 --- a/indra/newview/app_settings/shaders/class1/deferred/softenLightF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/softenLightF.glsl @@ -297,7 +297,6 @@ void main() vec4 spec = texture2DRect(specularRect, vary_fragcoord.xy); vec3 col; float bloom = 0.0; - if (diffuse.a < 0.9) { calcAtmospherics(pos.xyz, 1.0); @@ -322,23 +321,19 @@ void main() col += spec_contrib; } + col = mix(col.rgb, diffuse.rgb, diffuse.a); + if (envIntensity > 0.0) { //add environmentmap vec3 env_vec = env_mat * refnormpersp; col = mix(col.rgb, pow(textureCube(environmentMap, env_vec).rgb, vec3(2.2)) * 2.2, - max(envIntensity-diffuse.a*2.0, 0.0)); + envIntensity); } col = atmosLighting(col); col = scaleSoftClip(col); - - col = mix(col.rgb, diffuse.rgb, diffuse.a); } - else - { - col = diffuse.rgb; - } - + frag_color.rgb = col; //frag_color.a = bloom; diff --git a/indra/newview/app_settings/shaders/class1/deferred/waterF.glsl b/indra/newview/app_settings/shaders/class1/deferred/waterF.glsl index 1ae006bc8a..de858b34b5 100755 --- a/indra/newview/app_settings/shaders/class1/deferred/waterF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/waterF.glsl @@ -67,6 +67,12 @@ VARYING vec4 littleWave; VARYING vec4 view; VARYING vec4 vary_position; +vec2 encode_normal(vec3 n) +{ + float f = sqrt(8 * n.z + 8); + return n.xy / f + 0.5; +} + void main() { vec4 color; @@ -151,8 +157,8 @@ void main() //spec *= shadow; //color.rgb += spec * specular; - color.rgb = atmosTransport(color.rgb); - color.rgb = scaleSoftClip(color.rgb); + //color.rgb = atmosTransport(color.rgb); + //color.rgb = scaleSoftClip(color.rgb); //color.a = spec * sunAngle2; //wavef.z *= 0.1f; @@ -161,5 +167,5 @@ void main() frag_data[0] = vec4(color.rgb, 0.5); // diffuse frag_data[1] = vec4(0.5,0.5,0.5, 0.95); // speccolor*spec, spec - frag_data[2] = vec4(screenspacewavef.xyz*0.5+0.5, screenspacewavef.z*0.5); // normalxyz, displace + frag_data[2] = vec4(encode_normal(screenspacewavef), 0.0, 0.0); // normalxyz, displace } diff --git a/indra/newview/app_settings/shaders/class2/deferred/softenLightF.glsl b/indra/newview/app_settings/shaders/class2/deferred/softenLightF.glsl index 3d39394c32..466714c108 100755 --- a/indra/newview/app_settings/shaders/class2/deferred/softenLightF.glsl +++ b/indra/newview/app_settings/shaders/class2/deferred/softenLightF.glsl @@ -300,7 +300,6 @@ void main() vec3 col; float bloom = 0.0; - if (diffuse.a < 0.9) { vec4 spec = texture2DRect(specularRect, vary_fragcoord.xy); @@ -331,22 +330,19 @@ void main() col += spec_contrib; } + col = mix(col, diffuse.rgb, diffuse.a); + if (envIntensity > 0.0) { //add environmentmap vec3 env_vec = env_mat * refnormpersp; col = mix(col.rgb, pow(textureCube(environmentMap, env_vec).rgb, vec3(2.2)) * 2.2, - max(envIntensity-diffuse.a*2.0, 0.0)); + envIntensity); } col = atmosLighting(col); col = scaleSoftClip(col); - - col = mix(col, diffuse.rgb, diffuse.a); - } - else - { - col = diffuse.rgb; } + frag_color.rgb = col; frag_color.a = bloom; diff --git a/indra/newview/llface.cpp b/indra/newview/llface.cpp index 6a79e68c6a..0226efa944 100755 --- a/indra/newview/llface.cpp +++ b/indra/newview/llface.cpp @@ -51,7 +51,7 @@ #include "llviewerregion.h" #include "llviewerwindow.h" #include "llviewershadermgr.h" - +#include "llviewertexture.h" #define LL_MAX_INDICES_COUNT 1000000 @@ -167,13 +167,11 @@ void LLFace::init(LLDrawable* drawablep, LLViewerObject* objp) //special value to indicate uninitialized position mIndicesIndex = 0xFFFFFFFF; - mIndexInTex[LLRender::DIFFUSE_MAP] = - mIndexInTex[LLRender::NORMAL_MAP] = - mIndexInTex[LLRender::SPECULAR_MAP] = 0; - - mTexture[LLRender::DIFFUSE_MAP] = - mTexture[LLRender::NORMAL_MAP] = - mTexture[LLRender::SPECULAR_MAP] = NULL; + for (U32 i = 0; i < LLRender::NUM_TEXTURE_CHANNELS; ++i) + { + mIndexInTex[i] = 0; + mTexture[i] = NULL; + } mTEOffset = -1; mTextureIndex = 255; @@ -201,21 +199,14 @@ void LLFace::destroy() gPipeline.checkReferences(this); } - if(!mTexture[LLRender::DIFFUSE_MAP].isNull()) + for (U32 i = 0; i < LLRender::NUM_TEXTURE_CHANNELS; ++i) { - mTexture[LLRender::DIFFUSE_MAP]->removeFace(LLRender::DIFFUSE_MAP, this) ; + if(mTexture[i].notNull()) + { + mTexture[i]->removeFace(i, this) ; + } } - if(!mTexture[LLRender::NORMAL_MAP].isNull()) - { - mTexture[LLRender::NORMAL_MAP]->removeFace(LLRender::NORMAL_MAP, this) ; - } - - if(!mTexture[LLRender::SPECULAR_MAP].isNull()) - { - mTexture[LLRender::SPECULAR_MAP]->removeFace(LLRender::SPECULAR_MAP, this) ; - } - if (isState(LLFace::PARTICLE)) { LLVOPartGroup::freeVBSlot(getGeomIndex()/4); @@ -253,7 +244,7 @@ void LLFace::destroy() } setDrawInfo(NULL); - + mDrawablep = NULL; mVObjp = NULL; } @@ -306,29 +297,16 @@ void LLFace::setPool(LLFacePool* new_pool, LLViewerTexture *texturep) setTexture(texturep) ; } -void LLFace::setTexture(LLViewerTexture* tex) -{ - setTexture(LLRender::DIFFUSE_MAP, tex); -} - -void LLFace::setNormalMap(LLViewerTexture* tex) -{ - setTexture(LLRender::NORMAL_MAP, tex); -} - -void LLFace::setSpecularMap(LLViewerTexture* tex) -{ - setTexture(LLRender::SPECULAR_MAP, tex); -} - void LLFace::setTexture(U32 ch, LLViewerTexture* tex) { + llassert(ch < LLRender::NUM_TEXTURE_CHANNELS); + if(mTexture[ch] == tex) { return ; } - if(!mTexture[ch].isNull()) + if(mTexture[ch].notNull()) { mTexture[ch]->removeFace(ch, this) ; } @@ -341,26 +319,53 @@ void LLFace::setTexture(U32 ch, LLViewerTexture* tex) mTexture[ch] = tex ; } +void LLFace::setTexture(LLViewerTexture* tex) +{ + setDiffuseMap(tex); +} + +void LLFace::setDiffuseMap(LLViewerTexture* tex) +{ + setTexture(LLRender::DIFFUSE_MAP, tex); +} + +void LLFace::setNormalMap(LLViewerTexture* tex) +{ + setTexture(LLRender::NORMAL_MAP, tex); +} + +void LLFace::setSpecularMap(LLViewerTexture* tex) +{ + setTexture(LLRender::SPECULAR_MAP, tex); +} + void LLFace::dirtyTexture() { LLDrawable* drawablep = getDrawable(); - if (mVObjp.notNull() && mVObjp->getVolume() && - !mTexture[LLRender::DIFFUSE_MAP].isNull() && (mTexture[LLRender::DIFFUSE_MAP]->getComponents() == 4)) - { //dirty texture on an alpha object should be treated as an LoD update - LLVOVolume* vobj = drawablep->getVOVolume(); - if (vobj) + if (mVObjp.notNull() && mVObjp->getVolume()) + { + for (U32 ch = 0; ch < LLRender::NUM_TEXTURE_CHANNELS; ++ch) { - vobj->mLODChanged = TRUE; + if (mTexture[ch].notNull() && mTexture[ch]->getComponents() == 4) + { //dirty texture on an alpha object should be treated as an LoD update + LLVOVolume* vobj = drawablep->getVOVolume(); + if (vobj) + { + vobj->mLODChanged = TRUE; + } + gPipeline.markRebuild(drawablep, LLDrawable::REBUILD_VOLUME, FALSE); + } } - gPipeline.markRebuild(drawablep, LLDrawable::REBUILD_VOLUME, FALSE); - } + } gPipeline.markTextured(drawablep); } void LLFace::switchTexture(U32 ch, LLViewerTexture* new_texture) { + llassert(ch < LLRender::NUM_TEXTURE_CHANNELS); + if(mTexture[ch] == new_texture) { return ; @@ -371,9 +376,16 @@ void LLFace::switchTexture(U32 ch, LLViewerTexture* new_texture) llerrs << "Can not switch to a null texture." << llendl; return; } + + llassert(mTexture[ch].notNull()); + new_texture->addTextureStats(mTexture[ch]->getMaxVirtualSize()) ; - getViewerObject()->changeTEImage(mTEOffset, new_texture) ; + if (ch == LLRender::DIFFUSE_MAP) + { + getViewerObject()->changeTEImage(mTEOffset, new_texture) ; + } + setTexture(ch, new_texture) ; dirtyTexture(); } @@ -582,8 +594,8 @@ void LLFace::renderSelected(LLViewerTexture *imagep, const LLColor4& color) /* removed in lieu of raycast uv detection void LLFace::renderSelectedUV() { - LLViewerTexture* red_blue_imagep = LLViewerTextureManager::getFetchedTextureFromFile("uv_test1.j2c", TRUE, LLGLTexture::BOOST_UI); - LLViewerTexture* green_imagep = LLViewerTextureManager::getFetchedTextureFromFile("uv_test2.tga", TRUE, LLGLTexture::BOOST_UI); + LLViewerTexture* red_blue_imagep = LLViewerTextureManager::getFetchedTextureFromFile("uv_test1.j2c", TRUE, LLViewerTexture::BOOST_UI); + LLViewerTexture* green_imagep = LLViewerTextureManager::getFetchedTextureFromFile("uv_test2.tga", TRUE, LLViewerTexture::BOOST_UI); LLGLSUVSelect object_select; @@ -1612,11 +1624,18 @@ BOOL LLFace::getGeometryVolume(const LLVolume& volume, U8 tex_mode = 0; - if (isState(TEXTURE_ANIM)) - { + bool tex_anim = false; + LLVOVolume* vobj = (LLVOVolume*) (LLViewerObject*) mVObjp; tex_mode = vobj->mTexAnimMode; + if (vobj->mTextureAnimp) + { //texture animation is in play, override specular and normal map tex coords with diffuse texcoords + tex_anim = true; + } + + if (isState(TEXTURE_ANIM)) + { if (!tex_mode) { clearState(TEXTURE_ANIM); @@ -1652,7 +1671,7 @@ BOOL LLFace::getGeometryVolume(const LLVolume& volume, } bool do_tex_mat = tex_mode && mTextureMatrix; - + if (!do_bump) { //not bump mapped, might be able to do a cheap update mVertexBuffer->getTexCoord0Strider(tex_coords0, mGeomIndex, mGeomCount); @@ -1769,9 +1788,9 @@ BOOL LLFace::getGeometryVolume(const LLVolume& volume, else { //bump mapped or has material, just do the whole expensive loop LLFastTimer t(FTM_FACE_TEX_DEFAULT); - + std::vector<LLVector2> bump_tc; - + if (mat) { //writing out normal and specular texture coordinates, not bump offsets do_bump = false; @@ -1790,7 +1809,7 @@ BOOL LLFace::getGeometryVolume(const LLVolume& volume, if (mVertexBuffer->hasDataType(LLVertexBuffer::TYPE_TEXCOORD1)) { mVertexBuffer->getTexCoord1Strider(dst, mGeomIndex, mGeomCount, map_range); - if (mat) + if (mat && !tex_anim) { r = mat->getNormalRotation(); mat->getNormalOffset(os, ot); @@ -1810,7 +1829,7 @@ BOOL LLFace::getGeometryVolume(const LLVolume& volume, if (mVertexBuffer->hasDataType(LLVertexBuffer::TYPE_TEXCOORD2)) { mVertexBuffer->getTexCoord2Strider(dst, mGeomIndex, mGeomCount, map_range); - if (mat) + if (mat && !tex_anim) { r = mat->getSpecularRotation(); mat->getSpecularOffset(os, ot); @@ -1828,55 +1847,55 @@ BOOL LLFace::getGeometryVolume(const LLVolume& volume, } - for (S32 i = 0; i < num_vertices; i++) - { - LLVector2 tc(vf.mTexCoords[i]); + for (S32 i = 0; i < num_vertices; i++) + { + LLVector2 tc(vf.mTexCoords[i]); - LLVector4a& norm = vf.mNormals[i]; + LLVector4a& norm = vf.mNormals[i]; - LLVector4a& center = *(vf.mCenter); + LLVector4a& center = *(vf.mCenter); - if (texgen != LLTextureEntry::TEX_GEN_DEFAULT) - { - LLVector4a vec = vf.mPositions[i]; + if (texgen != LLTextureEntry::TEX_GEN_DEFAULT) + { + LLVector4a vec = vf.mPositions[i]; - vec.mul(scalea); + vec.mul(scalea); - switch (texgen) - { - case LLTextureEntry::TEX_GEN_PLANAR: - planarProjection(tc, norm, center, vec); - break; - case LLTextureEntry::TEX_GEN_SPHERICAL: - sphericalProjection(tc, norm, center, vec); - break; - case LLTextureEntry::TEX_GEN_CYLINDRICAL: - cylindricalProjection(tc, norm, center, vec); - break; - default: - break; - } - } + switch (texgen) + { + case LLTextureEntry::TEX_GEN_PLANAR: + planarProjection(tc, norm, center, vec); + break; + case LLTextureEntry::TEX_GEN_SPHERICAL: + sphericalProjection(tc, norm, center, vec); + break; + case LLTextureEntry::TEX_GEN_CYLINDRICAL: + cylindricalProjection(tc, norm, center, vec); + break; + default: + break; + } + } - if (tex_mode && mTextureMatrix) - { - LLVector3 tmp(tc.mV[0], tc.mV[1], 0.f); - tmp = tmp * *mTextureMatrix; - tc.mV[0] = tmp.mV[0]; - tc.mV[1] = tmp.mV[1]; - } - else - { - xform(tc, cos_ang, sin_ang, os, ot, ms, mt); - } + if (tex_mode && mTextureMatrix) + { + LLVector3 tmp(tc.mV[0], tc.mV[1], 0.f); + tmp = tmp * *mTextureMatrix; + tc.mV[0] = tmp.mV[0]; + tc.mV[1] = tmp.mV[1]; + } + else + { + xform(tc, cos_ang, sin_ang, os, ot, ms, mt); + } *dst++ = tc; - if (do_bump) - { - bump_tc.push_back(tc); + if (do_bump) + { + bump_tc.push_back(tc); + } } } - } if (map_range) { @@ -2016,11 +2035,11 @@ BOOL LLFace::getGeometryVolume(const LLVolume& volume, LLFastTimer t(FTM_FACE_GEOM_BINORMAL); mVertexBuffer->getBinormalStrider(binorm, mGeomIndex, mGeomCount, map_range); F32* binormals = (F32*) binorm.get(); - + mVObjp->getVolume()->genBinormals(f); for (S32 i = 0; i < num_vertices; i++) - { + { LLVector4a binormal; mat_normal.rotate(vf.mBinormals[i], binormal); binormal.normalize3fast(); @@ -2566,11 +2585,11 @@ LLVector3 LLFace::getPositionAgent() const } LLViewerTexture* LLFace::getTexture(U32 ch) const - { +{ llassert(ch < LLRender::NUM_TEXTURE_CHANNELS); return mTexture[ch] ; - } +} void LLFace::setVertexBuffer(LLVertexBuffer* buffer) { |