SH-2238, SH-2223, SH-SH-2242 glVertexAttrib throughout main render pipeline complete, preview renders and debug displays still pending. Also fixed a render glitch and a crash (JIRAs listed).
parent
f076bdf609
commit
2ee8154780
|
|
@ -934,7 +934,9 @@ void LLGLSLShader::uniform4fv(const string& uniform, U32 count, const GLfloat* v
|
|||
std::map<GLint, LLVector4>::iterator iter = mValue.find(location);
|
||||
if (iter == mValue.end() || shouldChange(iter->second,vec) || count != 1)
|
||||
{
|
||||
stop_glerror();
|
||||
glUniform4fvARB(location, count, v);
|
||||
stop_glerror();
|
||||
mValue[location] = vec;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -35,106 +35,11 @@
|
|||
|
||||
#include "llglheaders.h"
|
||||
|
||||
GLUquadricObj *gQuadObj2 = NULL;
|
||||
LLRenderSphere gSphere;
|
||||
|
||||
void drawSolidSphere(GLdouble radius, GLint slices, GLint stacks);
|
||||
|
||||
void drawSolidSphere(GLdouble radius, GLint slices, GLint stacks)
|
||||
{
|
||||
if (!gQuadObj2)
|
||||
{
|
||||
gQuadObj2 = gluNewQuadric();
|
||||
if (!gQuadObj2)
|
||||
{
|
||||
llwarns << "drawSolidSphere couldn't allocate quadric" << llendl;
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
gluQuadricDrawStyle(gQuadObj2, GLU_FILL);
|
||||
gluQuadricNormals(gQuadObj2, GLU_SMOOTH);
|
||||
// If we ever changed/used the texture or orientation state
|
||||
// of quadObj, we'd need to change it to the defaults here
|
||||
// with gluQuadricTexture and/or gluQuadricOrientation.
|
||||
gluQuadricTexture(gQuadObj2, GL_TRUE);
|
||||
gluSphere(gQuadObj2, radius, slices, stacks);
|
||||
}
|
||||
|
||||
|
||||
// A couple thoughts on sphere drawing:
|
||||
// 1) You need more slices than stacks, but little less than 2:1
|
||||
// 2) At low LOD, setting stacks to an odd number avoids a "band" around the equator, making things look smoother
|
||||
void LLRenderSphere::prerender()
|
||||
{
|
||||
// Create a series of display lists for different LODs
|
||||
mDList[0] = glGenLists(1);
|
||||
glNewList(mDList[0], GL_COMPILE);
|
||||
drawSolidSphere(1.0, 30, 20);
|
||||
glEndList();
|
||||
|
||||
mDList[1] = glGenLists(1);
|
||||
glNewList(mDList[1], GL_COMPILE);
|
||||
drawSolidSphere(1.0, 20, 15);
|
||||
glEndList();
|
||||
|
||||
mDList[2] = glGenLists(1);
|
||||
glNewList(mDList[2], GL_COMPILE);
|
||||
drawSolidSphere(1.0, 12, 8);
|
||||
glEndList();
|
||||
|
||||
mDList[3] = glGenLists(1);
|
||||
glNewList(mDList[3], GL_COMPILE);
|
||||
drawSolidSphere(1.0, 8, 5);
|
||||
glEndList();
|
||||
}
|
||||
|
||||
void LLRenderSphere::cleanupGL()
|
||||
{
|
||||
for (S32 detail = 0; detail < 4; detail++)
|
||||
{
|
||||
glDeleteLists(mDList[detail], 1);
|
||||
mDList[detail] = 0;
|
||||
}
|
||||
|
||||
if (gQuadObj2)
|
||||
{
|
||||
gluDeleteQuadric(gQuadObj2);
|
||||
gQuadObj2 = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
// Constants here are empirically derived from my eyeballs, JNC
|
||||
//
|
||||
// The toughest adjustment is the cutoff for the lowest LOD
|
||||
// Maybe we should have more LODs at the low end?
|
||||
void LLRenderSphere::render(F32 pixel_area)
|
||||
{
|
||||
S32 level_of_detail;
|
||||
|
||||
if (pixel_area > 10000.f)
|
||||
{
|
||||
level_of_detail = 0;
|
||||
}
|
||||
else if (pixel_area > 800.f)
|
||||
{
|
||||
level_of_detail = 1;
|
||||
}
|
||||
else if (pixel_area > 100.f)
|
||||
{
|
||||
level_of_detail = 2;
|
||||
}
|
||||
else
|
||||
{
|
||||
level_of_detail = 3;
|
||||
}
|
||||
glCallList(mDList[level_of_detail]);
|
||||
}
|
||||
|
||||
|
||||
void LLRenderSphere::render()
|
||||
{
|
||||
glCallList(mDList[0]);
|
||||
renderGGL();
|
||||
}
|
||||
|
||||
inline LLVector3 polar_to_cart(F32 latitude, F32 longitude)
|
||||
|
|
|
|||
|
|
@ -40,11 +40,6 @@ void lat2xyz(LLVector3 * result, F32 lat, F32 lon); // utility routine
|
|||
class LLRenderSphere
|
||||
{
|
||||
public:
|
||||
LLGLuint mDList[5];
|
||||
|
||||
void prerender();
|
||||
void cleanupGL();
|
||||
void render(F32 pixel_area); // of a box of size 1.0 at that position
|
||||
void render(); // render at highest LOD
|
||||
void renderGGL(); // render using LLRender
|
||||
|
||||
|
|
|
|||
|
|
@ -62,7 +62,6 @@ U32 LLVertexBuffer::sAllocatedBytes = 0;
|
|||
BOOL LLVertexBuffer::sMapped = FALSE;
|
||||
BOOL LLVertexBuffer::sUseStreamDraw = TRUE;
|
||||
BOOL LLVertexBuffer::sPreferStreamDraw = FALSE;
|
||||
S32 LLVertexBuffer::sWeight4Loc = -1;
|
||||
|
||||
std::vector<U32> LLVertexBuffer::sDeleteList;
|
||||
|
||||
|
|
@ -355,6 +354,8 @@ void LLVertexBuffer::setupClientArrays(U32 data_mask)
|
|||
//static
|
||||
void LLVertexBuffer::drawArrays(U32 mode, const std::vector<LLVector3>& pos, const std::vector<LLVector3>& norm)
|
||||
{
|
||||
llassert(!LLGLSLShader::sNoFixedFunction || LLGLSLShader::sCurBoundShaderPtr != NULL);
|
||||
|
||||
U32 count = pos.size();
|
||||
llassert_always(norm.size() >= pos.size());
|
||||
llassert_always(count > 0) ;
|
||||
|
|
@ -369,6 +370,49 @@ void LLVertexBuffer::drawArrays(U32 mode, const std::vector<LLVector3>& pos, con
|
|||
glDrawArrays(sGLMode[mode], 0, count);
|
||||
}
|
||||
|
||||
//static
|
||||
void LLVertexBuffer::drawElements(U32 mode, const LLVector4a* pos, const LLVector2* tc, S32 num_indices, const U16* indicesp)
|
||||
{
|
||||
llassert(!LLGLSLShader::sNoFixedFunction || LLGLSLShader::sCurBoundShaderPtr != NULL);
|
||||
|
||||
U32 mask = LLVertexBuffer::MAP_VERTEX;
|
||||
if (tc)
|
||||
{
|
||||
mask = mask | LLVertexBuffer::MAP_TEXCOORD0;
|
||||
}
|
||||
|
||||
unbind();
|
||||
|
||||
setupClientArrays(mask);
|
||||
|
||||
LLGLSLShader* shader = LLGLSLShader::sCurBoundShaderPtr;
|
||||
|
||||
if (shader)
|
||||
{
|
||||
S32 loc = shader->getAttribLocation(LLVertexBuffer::TYPE_VERTEX);
|
||||
if (loc > -1)
|
||||
{
|
||||
glVertexAttribPointerARB(loc, 3, GL_FLOAT, GL_FALSE, 16, pos);
|
||||
|
||||
if (tc)
|
||||
{
|
||||
loc = shader->getAttribLocation(LLVertexBuffer::TYPE_TEXCOORD0);
|
||||
if (loc > -1)
|
||||
{
|
||||
glVertexAttribPointerARB(loc, 2, GL_FLOAT, GL_FALSE, 0, tc);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
glTexCoordPointer(2, GL_FLOAT, 0, tc);
|
||||
glVertexPointer(3, GL_FLOAT, 16, pos);
|
||||
}
|
||||
|
||||
glDrawElements(sGLMode[mode], num_indices, GL_UNSIGNED_SHORT, indicesp);
|
||||
}
|
||||
|
||||
void LLVertexBuffer::validateRange(U32 start, U32 end, U32 count, U32 indices_offset) const
|
||||
{
|
||||
if (start >= (U32) mRequestedNumVerts ||
|
||||
|
|
@ -403,6 +447,7 @@ void LLVertexBuffer::drawRange(U32 mode, U32 start, U32 end, U32 count, U32 indi
|
|||
validateRange(start, end, count, indices_offset);
|
||||
|
||||
llassert(mRequestedNumVerts >= 0);
|
||||
llassert(!LLGLSLShader::sNoFixedFunction || LLGLSLShader::sCurBoundShaderPtr != NULL);
|
||||
|
||||
if (mGLIndices != sGLRenderIndices)
|
||||
{
|
||||
|
|
@ -431,6 +476,8 @@ void LLVertexBuffer::drawRange(U32 mode, U32 start, U32 end, U32 count, U32 indi
|
|||
|
||||
void LLVertexBuffer::draw(U32 mode, U32 count, U32 indices_offset) const
|
||||
{
|
||||
llassert(!LLGLSLShader::sNoFixedFunction || LLGLSLShader::sCurBoundShaderPtr != NULL);
|
||||
|
||||
llassert(mRequestedNumIndices >= 0);
|
||||
if (indices_offset >= (U32) mRequestedNumIndices ||
|
||||
indices_offset + count > (U32) mRequestedNumIndices)
|
||||
|
|
@ -463,6 +510,8 @@ void LLVertexBuffer::draw(U32 mode, U32 count, U32 indices_offset) const
|
|||
|
||||
void LLVertexBuffer::drawArrays(U32 mode, U32 first, U32 count) const
|
||||
{
|
||||
llassert(!LLGLSLShader::sNoFixedFunction || LLGLSLShader::sCurBoundShaderPtr != NULL);
|
||||
|
||||
llassert(mRequestedNumVerts >= 0);
|
||||
if (first >= (U32) mRequestedNumVerts ||
|
||||
first + count > (U32) mRequestedNumVerts)
|
||||
|
|
@ -2037,9 +2086,16 @@ void LLVertexBuffer::setupVertexBuffer(U32 data_mask) const
|
|||
|
||||
}
|
||||
|
||||
if (data_mask & MAP_WEIGHT4 && sWeight4Loc != -1)
|
||||
if (data_mask & MAP_WEIGHT4)
|
||||
{
|
||||
glVertexAttribPointerARB(sWeight4Loc, 4, GL_FLOAT, FALSE, LLVertexBuffer::sTypeSize[TYPE_WEIGHT4], (void*)(base+mOffsets[TYPE_WEIGHT4]));
|
||||
if (shader)
|
||||
{
|
||||
S32 loc = shader->getAttribLocation(TYPE_WEIGHT4);
|
||||
if (loc > -1)
|
||||
{
|
||||
glVertexAttribPointerARB(loc, 4, GL_FLOAT, FALSE, LLVertexBuffer::sTypeSize[TYPE_WEIGHT4], (void*)(base+mOffsets[TYPE_WEIGHT4]));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (data_mask & MAP_CLOTHWEIGHT)
|
||||
|
|
|
|||
|
|
@ -111,8 +111,6 @@ public:
|
|||
static LLVBOPool sStreamIBOPool;
|
||||
static LLVBOPool sDynamicIBOPool;
|
||||
|
||||
static S32 sWeight4Loc;
|
||||
|
||||
static BOOL sUseStreamDraw;
|
||||
static BOOL sPreferStreamDraw;
|
||||
|
||||
|
|
@ -120,6 +118,7 @@ public:
|
|||
static void cleanupClass();
|
||||
static void setupClientArrays(U32 data_mask);
|
||||
static void drawArrays(U32 mode, const std::vector<LLVector3>& pos, const std::vector<LLVector3>& norm);
|
||||
static void drawElements(U32 mode, const LLVector4a* pos, const LLVector2* tc, S32 num_indices, const U16* indicesp);
|
||||
|
||||
static void clientCopy(F64 max_time = 0.005); //copy data from client to GL
|
||||
static void unbind(); //unbind any bound vertex buffer
|
||||
|
|
|
|||
|
|
@ -7,7 +7,7 @@
|
|||
|
||||
|
||||
|
||||
attribute vec4 object_weight;
|
||||
attribute vec4 weight4;
|
||||
|
||||
uniform mat4 matrixPalette[32];
|
||||
|
||||
|
|
@ -15,8 +15,8 @@ mat4 getObjectSkinnedTransform()
|
|||
{
|
||||
int i;
|
||||
|
||||
vec4 w = fract(object_weight);
|
||||
vec4 index = floor(object_weight);
|
||||
vec4 w = fract(weight4);
|
||||
vec4 index = floor(weight4);
|
||||
|
||||
float scale = 1.0/(w.x+w.y+w.z+w.w);
|
||||
w *= scale;
|
||||
|
|
|
|||
|
|
@ -0,0 +1,63 @@
|
|||
/**
|
||||
* @file alphaNonIndexedNoColorF.glsl
|
||||
*
|
||||
* $LicenseInfo:firstyear=2007&license=viewerlgpl$
|
||||
* $/LicenseInfo$
|
||||
*/
|
||||
|
||||
|
||||
|
||||
#extension GL_ARB_texture_rectangle : enable
|
||||
|
||||
uniform sampler2DRect depthMap;
|
||||
uniform sampler2D diffuseMap;
|
||||
|
||||
uniform mat4 shadow_matrix[6];
|
||||
uniform vec4 shadow_clip;
|
||||
uniform vec2 screen_res;
|
||||
|
||||
vec3 atmosLighting(vec3 light);
|
||||
vec3 scaleSoftClip(vec3 light);
|
||||
|
||||
varying vec3 vary_ambient;
|
||||
varying vec3 vary_directional;
|
||||
varying vec3 vary_fragcoord;
|
||||
varying vec3 vary_position;
|
||||
varying vec3 vary_pointlight_col;
|
||||
|
||||
uniform mat4 inv_proj;
|
||||
|
||||
vec4 getPosition(vec2 pos_screen)
|
||||
{
|
||||
float depth = texture2DRect(depthMap, pos_screen.xy).a;
|
||||
vec2 sc = pos_screen.xy*2.0;
|
||||
sc /= screen_res;
|
||||
sc -= vec2(1.0,1.0);
|
||||
vec4 ndc = vec4(sc.x, sc.y, 2.0*depth-1.0, 1.0);
|
||||
vec4 pos = inv_proj * ndc;
|
||||
pos /= pos.w;
|
||||
pos.w = 1.0;
|
||||
return pos;
|
||||
}
|
||||
|
||||
void main()
|
||||
{
|
||||
vec2 frag = vary_fragcoord.xy/vary_fragcoord.z*0.5+0.5;
|
||||
frag *= screen_res;
|
||||
|
||||
vec4 pos = vec4(vary_position, 1.0);
|
||||
|
||||
vec4 diff= texture2D(diffuseMap,gl_TexCoord[0].xy);
|
||||
|
||||
vec4 col = vec4(vary_ambient + vary_directional.rgb, 1.0);
|
||||
vec4 color = diff * col;
|
||||
|
||||
color.rgb = atmosLighting(color.rgb);
|
||||
|
||||
color.rgb = scaleSoftClip(color.rgb);
|
||||
|
||||
color.rgb += diff.rgb * vary_pointlight_col.rgb;
|
||||
|
||||
gl_FragColor = color;
|
||||
}
|
||||
|
||||
|
|
@ -7,7 +7,6 @@
|
|||
|
||||
attribute vec3 position;
|
||||
attribute vec3 normal;
|
||||
attribute vec4 diffuse_color;
|
||||
attribute vec2 texcoord0;
|
||||
|
||||
vec4 calcLighting(vec3 pos, vec3 norm, vec4 color, vec4 baseCol);
|
||||
|
|
@ -86,9 +85,7 @@ void main()
|
|||
|
||||
calcAtmospherics(pos.xyz);
|
||||
|
||||
//vec4 color = calcLighting(pos.xyz, norm, diffuse_color, vec4(0.));
|
||||
|
||||
vec4 col = vec4(0.0, 0.0, 0.0, diffuse_color.a);
|
||||
vec4 col = vec4(0.0, 0.0, 0.0, 1.0);
|
||||
|
||||
// Collect normal lights
|
||||
col.rgb += gl_LightSource[2].diffuse.rgb*calcPointLightOrSpotLight(pos.xyz, norm, gl_LightSource[2].position, gl_LightSource[2].spotDirection.xyz, gl_LightSource[2].linearAttenuation, gl_LightSource[2].quadraticAttenuation, gl_LightSource[2].specular.a);
|
||||
|
|
@ -98,17 +95,17 @@ void main()
|
|||
col.rgb += gl_LightSource[6].diffuse.rgb*calcPointLightOrSpotLight(pos.xyz, norm, gl_LightSource[6].position, gl_LightSource[6].spotDirection.xyz, gl_LightSource[6].linearAttenuation, gl_LightSource[6].quadraticAttenuation, gl_LightSource[6].specular.a);
|
||||
col.rgb += gl_LightSource[7].diffuse.rgb*calcPointLightOrSpotLight(pos.xyz, norm, gl_LightSource[7].position, gl_LightSource[7].spotDirection.xyz, gl_LightSource[7].linearAttenuation, gl_LightSource[7].quadraticAttenuation, gl_LightSource[7].specular.a);
|
||||
|
||||
vary_pointlight_col = col.rgb*diffuse_color.rgb;
|
||||
vary_pointlight_col = col.rgb;
|
||||
|
||||
col.rgb = vec3(0,0,0);
|
||||
|
||||
// Add windlight lights
|
||||
col.rgb = atmosAmbient(vec3(0.));
|
||||
|
||||
vary_ambient = col.rgb*diffuse_color.rgb;
|
||||
vary_directional = diffuse_color.rgb*atmosAffectDirectionalLight(max(calcDirectionalLight(norm, gl_LightSource[0].position.xyz), (1.0-diffuse_color.a)*(1.0-diffuse_color.a)));
|
||||
vary_ambient = col.rgb;
|
||||
vary_directional = atmosAffectDirectionalLight(max(calcDirectionalLight(norm, gl_LightSource[0].position.xyz), 0.0));
|
||||
|
||||
col.rgb = min(col.rgb*diffuse_color.rgb, 1.0);
|
||||
col.rgb = min(col.rgb, 1.0);
|
||||
|
||||
gl_FrontColor = col;
|
||||
|
||||
|
|
|
|||
|
|
@ -13,7 +13,7 @@ varying vec3 vary_normal;
|
|||
|
||||
void main()
|
||||
{
|
||||
vec4 diff = gl_Color*texture2D(diffuseMap, gl_TexCoord[0].xy);
|
||||
vec4 diff = texture2D(diffuseMap, gl_TexCoord[0].xy);
|
||||
|
||||
if (diff.a < 0.2)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -13,7 +13,6 @@ varying vec4 post_pos;
|
|||
|
||||
void main()
|
||||
{
|
||||
//gl_FragColor = vec4(1,1,1,gl_Color.a * texture2D(diffuseMap, gl_TexCoord[0].xy).a);
|
||||
gl_FragColor = vec4(1,1,1,1);
|
||||
|
||||
gl_FragDepth = max(post_pos.z/post_pos.w*0.5+0.5, 0.0);
|
||||
|
|
|
|||
|
|
@ -11,10 +11,8 @@ mat4 getSkinnedTransform();
|
|||
|
||||
attribute vec3 position;
|
||||
attribute vec3 normal;
|
||||
attribute vec4 diffuse_color;
|
||||
attribute vec2 texcoord0;
|
||||
|
||||
|
||||
varying vec4 post_pos;
|
||||
|
||||
void main()
|
||||
|
|
@ -40,8 +38,6 @@ void main()
|
|||
post_pos = pos;
|
||||
|
||||
gl_Position = vec4(pos.x, pos.y, pos.w*0.5, pos.w);
|
||||
|
||||
gl_FrontColor = diffuse_color;
|
||||
}
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -6,7 +6,6 @@
|
|||
*/
|
||||
|
||||
attribute vec3 position;
|
||||
attribute vec4 diffuse_color;
|
||||
attribute vec3 normal;
|
||||
attribute vec2 texcoord0;
|
||||
|
||||
|
|
@ -38,8 +37,6 @@ void main()
|
|||
vary_normal = norm;
|
||||
|
||||
gl_Position = gl_ProjectionMatrix * pos;
|
||||
|
||||
gl_FrontColor = diffuse_color;
|
||||
}
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
/**
|
||||
* @file diffuseF.glsl
|
||||
* @file diffuseAlphaMaskF.glsl
|
||||
*
|
||||
* $LicenseInfo:firstyear=2007&license=viewerlgpl$
|
||||
* $/LicenseInfo$
|
||||
|
|
@ -15,7 +15,7 @@ varying vec3 vary_normal;
|
|||
|
||||
void main()
|
||||
{
|
||||
vec4 col = gl_Color * texture2D(diffuseMap, gl_TexCoord[0].xy) * gl_Color;
|
||||
vec4 col = texture2D(diffuseMap, gl_TexCoord[0].xy) * gl_Color;
|
||||
|
||||
if (col.a < minimum_alpha || col.a > maximum_alpha)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -0,0 +1,30 @@
|
|||
/**
|
||||
* @file diffuseAlphaMaskNoColorF.glsl
|
||||
*
|
||||
* $LicenseInfo:firstyear=2007&license=viewerlgpl$
|
||||
* $/LicenseInfo$
|
||||
*/
|
||||
|
||||
|
||||
uniform float minimum_alpha;
|
||||
uniform float maximum_alpha;
|
||||
|
||||
uniform sampler2D diffuseMap;
|
||||
|
||||
varying vec3 vary_normal;
|
||||
|
||||
void main()
|
||||
{
|
||||
vec4 col = texture2D(diffuseMap, gl_TexCoord[0].xy);
|
||||
|
||||
if (col.a < minimum_alpha || col.a > maximum_alpha)
|
||||
{
|
||||
discard;
|
||||
}
|
||||
|
||||
gl_FragData[0] = vec4(col.rgb, 0.0);
|
||||
gl_FragData[1] = vec4(0,0,0,0); // spec
|
||||
vec3 nvn = normalize(vary_normal);
|
||||
gl_FragData[2] = vec4(nvn.xy * 0.5 + 0.5, nvn.z, 0.0);
|
||||
}
|
||||
|
||||
|
|
@ -0,0 +1,23 @@
|
|||
/**
|
||||
* @file diffuseNoColorV.glsl
|
||||
*
|
||||
* $LicenseInfo:firstyear=2007&license=viewerlgpl$
|
||||
* $/LicenseInfo$
|
||||
*/
|
||||
|
||||
|
||||
attribute vec3 position;
|
||||
attribute vec3 normal;
|
||||
attribute vec2 texcoord0;
|
||||
|
||||
varying vec3 vary_normal;
|
||||
varying float vary_texture_index;
|
||||
|
||||
void main()
|
||||
{
|
||||
//transform vertex
|
||||
gl_Position = gl_ModelViewProjectionMatrix * vec4(position.xyz, 1.0);
|
||||
gl_TexCoord[0] = gl_TextureMatrix[0] * vec4(texcoord0,0,1);
|
||||
|
||||
vary_normal = normalize(gl_NormalMatrix * normal);
|
||||
}
|
||||
|
|
@ -0,0 +1,28 @@
|
|||
/**
|
||||
* @file emissiveF.glsl
|
||||
*
|
||||
* $LicenseInfo:firstyear=2007&license=viewerlgpl$
|
||||
* $/LicenseInfo$
|
||||
*/
|
||||
|
||||
|
||||
|
||||
#extension GL_ARB_texture_rectangle : enable
|
||||
|
||||
vec3 fullbrightAtmosTransport(vec3 light);
|
||||
vec3 fullbrightScaleSoftClip(vec3 light);
|
||||
|
||||
|
||||
void main()
|
||||
{
|
||||
float shadow = 1.0;
|
||||
|
||||
vec4 color = diffuseLookup(gl_TexCoord[0].xy)*gl_Color;
|
||||
|
||||
color.rgb = fullbrightAtmosTransport(color.rgb);
|
||||
|
||||
color.rgb = fullbrightScaleSoftClip(color.rgb);
|
||||
|
||||
gl_FragColor = color;
|
||||
}
|
||||
|
||||
|
|
@ -0,0 +1,38 @@
|
|||
/**
|
||||
* @file emissiveV.glsl
|
||||
*
|
||||
* $LicenseInfo:firstyear=2007&license=viewerlgpl$
|
||||
* $/LicenseInfo$
|
||||
*/
|
||||
|
||||
|
||||
attribute vec4 position;
|
||||
attribute float emissive;
|
||||
attribute vec2 texcoord0;
|
||||
|
||||
void calcAtmospherics(vec3 inPositionEye);
|
||||
|
||||
vec3 atmosAmbient(vec3 light);
|
||||
vec3 atmosAffectDirectionalLight(float lightIntensity);
|
||||
vec3 scaleDownLight(vec3 light);
|
||||
vec3 scaleUpLight(vec3 light);
|
||||
|
||||
varying float vary_texture_index;
|
||||
|
||||
void main()
|
||||
{
|
||||
//transform vertex
|
||||
vec4 vert = vec4(position.xyz, 1.0);
|
||||
vec4 pos = (gl_ModelViewMatrix * vert);
|
||||
vary_texture_index = position.w;
|
||||
|
||||
gl_Position = gl_ModelViewProjectionMatrix*vec4(position.xyz, 1.0);
|
||||
|
||||
gl_TexCoord[0] = gl_TextureMatrix[0] * vec4(texcoord0,0,1);
|
||||
|
||||
calcAtmospherics(pos.xyz);
|
||||
|
||||
gl_FrontColor = vec4(0,0,0,emissive);
|
||||
|
||||
gl_FogFragCoord = pos.z;
|
||||
}
|
||||
|
|
@ -7,7 +7,6 @@
|
|||
|
||||
|
||||
attribute vec3 position;
|
||||
attribute vec4 diffuse_color;
|
||||
|
||||
varying vec4 vary_fragcoord;
|
||||
|
||||
|
|
@ -18,5 +17,4 @@ void main()
|
|||
vary_fragcoord = pos;
|
||||
|
||||
gl_Position = pos;
|
||||
gl_FrontColor = diffuse_color;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -37,7 +37,10 @@ uniform float sun_wash;
|
|||
uniform int proj_shadow_idx;
|
||||
uniform float shadow_fade;
|
||||
|
||||
varying vec4 vary_light;
|
||||
uniform vec3 center;
|
||||
uniform vec3 color;
|
||||
uniform float falloff;
|
||||
uniform float size;
|
||||
|
||||
varying vec4 vary_fragcoord;
|
||||
uniform vec2 screen_res;
|
||||
|
|
@ -92,7 +95,7 @@ vec4 texture2DLodAmbient(sampler2D projectionMap, vec2 tc, float lod)
|
|||
|
||||
vec4 getPosition(vec2 pos_screen)
|
||||
{
|
||||
float depth = texture2DRect(depthMap, pos_screen.xy).a;
|
||||
float depth = texture2DRect(depthMap, pos_screen.xy).r;
|
||||
vec2 sc = pos_screen.xy*2.0;
|
||||
sc /= screen_res;
|
||||
sc -= vec2(1.0,1.0);
|
||||
|
|
@ -111,9 +114,9 @@ void main()
|
|||
frag.xy *= screen_res;
|
||||
|
||||
vec3 pos = getPosition(frag.xy).xyz;
|
||||
vec3 lv = vary_light.xyz-pos.xyz;
|
||||
vec3 lv = center.xyz-pos.xyz;
|
||||
float dist2 = dot(lv,lv);
|
||||
dist2 /= vary_light.w;
|
||||
dist2 /= size;
|
||||
if (dist2 > 1.0)
|
||||
{
|
||||
discard;
|
||||
|
|
@ -127,16 +130,16 @@ void main()
|
|||
vec4 proj_tc = (proj_mat * vec4(pos.xyz, 1.0));
|
||||
if (proj_tc.z < 0.0)
|
||||
{
|
||||
discard;
|
||||
//discard;
|
||||
}
|
||||
|
||||
proj_tc.xyz /= proj_tc.w;
|
||||
|
||||
float fa = gl_Color.a+1.0;
|
||||
float fa = falloff+1.0;
|
||||
float dist_atten = min(1.0-(dist2-1.0*(1.0-fa))/fa, 1.0);
|
||||
if (dist_atten <= 0.0)
|
||||
{
|
||||
discard;
|
||||
//discard;
|
||||
}
|
||||
|
||||
lv = proj_origin-pos.xyz;
|
||||
|
|
@ -164,7 +167,7 @@ void main()
|
|||
|
||||
vec4 plcol = texture2DLodDiffuse(projectionMap, proj_tc.xy, lod);
|
||||
|
||||
vec3 lcol = gl_Color.rgb * plcol.rgb * plcol.a;
|
||||
vec3 lcol = color.rgb * plcol.rgb * plcol.a;
|
||||
|
||||
lit = da * dist_atten * noise;
|
||||
|
||||
|
|
@ -181,7 +184,7 @@ void main()
|
|||
|
||||
amb_da = min(amb_da, 1.0-lit);
|
||||
|
||||
col += amb_da*gl_Color.rgb*diff_tex.rgb*amb_plcol.rgb*amb_plcol.a;
|
||||
col += amb_da*color.rgb*diff_tex.rgb*amb_plcol.rgb*amb_plcol.a;
|
||||
}
|
||||
|
||||
|
||||
|
|
@ -214,7 +217,7 @@ void main()
|
|||
stc.y > 0.0)
|
||||
{
|
||||
vec4 scol = texture2DLodSpecular(projectionMap, stc.xy, proj_lod-spec.a*proj_lod);
|
||||
col += dist_atten*scol.rgb*gl_Color.rgb*scol.a*spec.rgb;
|
||||
col += dist_atten*scol.rgb*color.rgb*scol.a*spec.rgb;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -20,7 +20,10 @@ uniform sampler2DRect depthMap;
|
|||
uniform vec3 env_mat[3];
|
||||
uniform float sun_wash;
|
||||
|
||||
varying vec4 vary_light;
|
||||
uniform vec3 center;
|
||||
uniform vec3 color;
|
||||
uniform float falloff;
|
||||
uniform float size;
|
||||
|
||||
varying vec4 vary_fragcoord;
|
||||
uniform vec2 screen_res;
|
||||
|
|
@ -49,9 +52,9 @@ void main()
|
|||
frag.xy *= screen_res;
|
||||
|
||||
vec3 pos = getPosition(frag.xy).xyz;
|
||||
vec3 lv = vary_light.xyz-pos;
|
||||
vec3 lv = center.xyz-pos;
|
||||
float dist2 = dot(lv,lv);
|
||||
dist2 /= vary_light.w;
|
||||
dist2 /= size;
|
||||
if (dist2 > 1.0)
|
||||
{
|
||||
discard;
|
||||
|
|
@ -72,11 +75,11 @@ void main()
|
|||
float noise = texture2D(noiseMap, frag.xy/128.0).b;
|
||||
|
||||
vec3 col = texture2DRect(diffuseRect, frag.xy).rgb;
|
||||
float fa = gl_Color.a+1.0;
|
||||
float fa = falloff+1.0;
|
||||
float dist_atten = clamp(1.0-(dist2-1.0*(1.0-fa))/fa, 0.0, 1.0);
|
||||
float lit = da * dist_atten * noise;
|
||||
|
||||
col = gl_Color.rgb*lit*col;
|
||||
col = color.rgb*lit*col;
|
||||
|
||||
vec4 spec = texture2DRect(specularRect, frag.xy);
|
||||
if (spec.a > 0.0)
|
||||
|
|
@ -86,7 +89,7 @@ void main()
|
|||
{
|
||||
sa = texture2D(lightFunc, vec2(sa, spec.a)).a * min(dist_atten*4.0, 1.0);
|
||||
sa *= noise;
|
||||
col += da*sa*gl_Color.rgb*spec.rgb;
|
||||
col += da*sa*color.rgb*spec.rgb;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -6,10 +6,7 @@
|
|||
*/
|
||||
|
||||
attribute vec3 position;
|
||||
attribute vec4 diffuse_color;
|
||||
attribute vec2 texcoord0;
|
||||
|
||||
varying vec4 vary_light;
|
||||
varying vec4 vary_fragcoord;
|
||||
|
||||
void main()
|
||||
|
|
@ -18,12 +15,5 @@ void main()
|
|||
vec4 pos = gl_ModelViewProjectionMatrix * vec4(position.xyz, 1.0);
|
||||
vary_fragcoord = pos;
|
||||
|
||||
vec4 tex = vec4(texcoord0,0,1);
|
||||
tex.w = 1.0;
|
||||
|
||||
vary_light = vec4(texcoord0,0,1);
|
||||
|
||||
gl_Position = pos;
|
||||
|
||||
gl_FrontColor = diffuse_color;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -306,5 +306,6 @@ void main()
|
|||
}
|
||||
|
||||
gl_FragColor.rgb = col;
|
||||
|
||||
gl_FragColor.a = bloom;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -13,7 +13,6 @@ uniform sampler2DRect diffuseRect;
|
|||
uniform sampler2DRect specularRect;
|
||||
uniform sampler2DRect depthMap;
|
||||
uniform sampler2DRect normalMap;
|
||||
uniform samplerCube environmentMap;
|
||||
uniform sampler2D noiseMap;
|
||||
uniform sampler2D lightFunc;
|
||||
uniform sampler2D projectionMap;
|
||||
|
|
@ -32,7 +31,10 @@ uniform float far_clip;
|
|||
uniform vec3 proj_origin; //origin of projection to be used for angular attenuation
|
||||
uniform float sun_wash;
|
||||
|
||||
varying vec4 vary_light;
|
||||
uniform vec3 center;
|
||||
uniform vec3 color;
|
||||
uniform float falloff;
|
||||
uniform float size;
|
||||
|
||||
varying vec4 vary_fragcoord;
|
||||
uniform vec2 screen_res;
|
||||
|
|
@ -60,9 +62,9 @@ void main()
|
|||
frag.xy *= screen_res;
|
||||
|
||||
vec3 pos = getPosition(frag.xy).xyz;
|
||||
vec3 lv = vary_light.xyz-pos.xyz;
|
||||
vec3 lv = center.xyz-pos.xyz;
|
||||
float dist2 = dot(lv,lv);
|
||||
dist2 /= vary_light.w;
|
||||
dist2 /= size;
|
||||
if (dist2 > 1.0)
|
||||
{
|
||||
discard;
|
||||
|
|
@ -82,7 +84,7 @@ void main()
|
|||
|
||||
proj_tc.xyz /= proj_tc.w;
|
||||
|
||||
float fa = gl_Color.a+1.0;
|
||||
float fa = falloff+1.0;
|
||||
float dist_atten = clamp(1.0-(dist2-1.0*(1.0-fa))/fa, 0.0, 1.0);
|
||||
|
||||
lv = proj_origin-pos.xyz;
|
||||
|
|
@ -108,7 +110,7 @@ void main()
|
|||
|
||||
vec4 plcol = texture2DLod(projectionMap, proj_tc.xy, lod);
|
||||
|
||||
vec3 lcol = gl_Color.rgb * plcol.rgb * plcol.a;
|
||||
vec3 lcol = color.rgb * plcol.rgb * plcol.a;
|
||||
|
||||
lit = da * dist_atten * noise;
|
||||
|
||||
|
|
@ -127,7 +129,7 @@ void main()
|
|||
|
||||
amb_da = min(amb_da, 1.0-lit);
|
||||
|
||||
col += amb_da*gl_Color.rgb*diff_tex.rgb*amb_plcol.rgb*amb_plcol.a;
|
||||
col += amb_da*color.rgb*diff_tex.rgb*amb_plcol.rgb*amb_plcol.a;
|
||||
}
|
||||
|
||||
|
||||
|
|
@ -156,7 +158,7 @@ void main()
|
|||
stc.y > 0.0)
|
||||
{
|
||||
vec4 scol = texture2DLod(projectionMap, stc.xy, proj_lod-spec.a*proj_lod);
|
||||
col += dist_atten*scol.rgb*gl_Color.rgb*scol.a*spec.rgb;
|
||||
col += dist_atten*scol.rgb*color.rgb*scol.a*spec.rgb;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -25,7 +25,6 @@ uniform float ssao_factor;
|
|||
uniform float ssao_factor_inv;
|
||||
|
||||
varying vec2 vary_fragcoord;
|
||||
varying vec4 vary_light;
|
||||
|
||||
uniform mat4 inv_proj;
|
||||
uniform vec2 screen_res;
|
||||
|
|
|
|||
|
|
@ -6,11 +6,7 @@
|
|||
*/
|
||||
|
||||
attribute vec3 position;
|
||||
attribute vec3 normal;
|
||||
attribute vec4 diffuse_color;
|
||||
attribute vec2 texcoord0;
|
||||
|
||||
varying vec4 vary_light;
|
||||
varying vec2 vary_fragcoord;
|
||||
|
||||
uniform vec2 screen_res;
|
||||
|
|
@ -22,10 +18,4 @@ void main()
|
|||
gl_Position = pos;
|
||||
|
||||
vary_fragcoord = (pos.xy * 0.5 + 0.5)*screen_res;
|
||||
vec4 tex = vec4(texcoord0,0,1);
|
||||
tex.w = 1.0;
|
||||
|
||||
vary_light = vec4(texcoord0,0,1);
|
||||
|
||||
gl_FrontColor = diffuse_color;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -11,10 +11,18 @@ uniform sampler2D diffuseMap;
|
|||
|
||||
varying vec3 vary_normal;
|
||||
|
||||
uniform float minimum_alpha;
|
||||
uniform float maximum_alpha;
|
||||
|
||||
void main()
|
||||
{
|
||||
vec4 col = texture2D(diffuseMap, gl_TexCoord[0].xy);
|
||||
gl_FragData[0] = vec4(gl_Color.rgb*col.rgb, col.a <= 0.5 ? 0.0 : 0.005);
|
||||
if (col.a < minimum_alpha || col.a > maximum_alpha)
|
||||
{
|
||||
discard;
|
||||
}
|
||||
|
||||
gl_FragData[0] = vec4(gl_Color.rgb*col.rgb, 0.0);
|
||||
gl_FragData[1] = vec4(0,0,0,0);
|
||||
vec3 nvn = normalize(vary_normal);
|
||||
gl_FragData[2] = vec4(nvn.xy * 0.5 + 0.5, nvn.z, 0.0);
|
||||
|
|
|
|||
|
|
@ -0,0 +1,27 @@
|
|||
/**
|
||||
* @file treeShadowF.glsl
|
||||
*
|
||||
* $LicenseInfo:firstyear=2007&license=viewerlgpl$
|
||||
* $/LicenseInfo$
|
||||
*/
|
||||
|
||||
uniform float minimum_alpha;
|
||||
uniform float maximum_alpha;
|
||||
|
||||
uniform sampler2D diffuseMap;
|
||||
|
||||
varying vec4 post_pos;
|
||||
|
||||
void main()
|
||||
{
|
||||
float alpha = texture2D(diffuseMap, gl_TexCoord[0].xy).a;
|
||||
|
||||
if (alpha < minimum_alpha || alpha > maximum_alpha)
|
||||
{
|
||||
discard;
|
||||
}
|
||||
|
||||
gl_FragColor = vec4(1,1,1,1);
|
||||
|
||||
gl_FragDepth = max(post_pos.z/post_pos.w*0.5+0.5, 0.0);
|
||||
}
|
||||
|
|
@ -0,0 +1,23 @@
|
|||
/**
|
||||
* @file treeShadowV.glsl
|
||||
*
|
||||
* $LicenseInfo:firstyear=2007&license=viewerlgpl$
|
||||
* $/LicenseInfo$
|
||||
*/
|
||||
|
||||
attribute vec3 position;
|
||||
attribute vec2 texcoord0;
|
||||
|
||||
varying vec4 post_pos;
|
||||
|
||||
void main()
|
||||
{
|
||||
//transform vertex
|
||||
vec4 pos = gl_ModelViewProjectionMatrix*vec4(position.xyz, 1.0);
|
||||
|
||||
post_pos = pos;
|
||||
|
||||
gl_Position = vec4(pos.x, pos.y, pos.w*0.5, pos.w);
|
||||
|
||||
gl_TexCoord[0] = gl_TextureMatrix[0] * vec4(texcoord0,0,1);
|
||||
}
|
||||
|
|
@ -10,7 +10,6 @@ attribute vec3 position;
|
|||
attribute vec3 normal;
|
||||
attribute vec2 texcoord0;
|
||||
|
||||
|
||||
varying vec3 vary_normal;
|
||||
|
||||
void main()
|
||||
|
|
|
|||
|
|
@ -0,0 +1,13 @@
|
|||
/**
|
||||
* @file onetexturenocolorF.glsl
|
||||
*
|
||||
* $LicenseInfo:firstyear=2007&license=viewerlgpl$
|
||||
* $/LicenseInfo$
|
||||
*/
|
||||
|
||||
uniform sampler2D tex0;
|
||||
|
||||
void main()
|
||||
{
|
||||
gl_FragColor = texture2D(tex0, gl_TexCoord[0].xy);
|
||||
}
|
||||
|
|
@ -0,0 +1,18 @@
|
|||
/**
|
||||
* @file onetexturenocolorV.glsl
|
||||
*
|
||||
* $LicenseInfo:firstyear=2007&license=viewerlgpl$
|
||||
* $/LicenseInfo$
|
||||
*/
|
||||
|
||||
|
||||
attribute vec3 position;
|
||||
attribute vec2 texcoord0;
|
||||
|
||||
|
||||
void main()
|
||||
{
|
||||
gl_Position = gl_ModelViewProjectionMatrix * vec4(position, 1);
|
||||
gl_TexCoord[0] = vec4(texcoord0,0,1);
|
||||
}
|
||||
|
||||
|
|
@ -14,7 +14,7 @@ attribute vec2 texcoord0;
|
|||
void main()
|
||||
{
|
||||
gl_Position = gl_ModelViewProjectionMatrix * vec4(position, 1);
|
||||
gl_TexCoord[0] = vec4(texcoord0,0,1);
|
||||
gl_TexCoord[0] = gl_TextureMatrix[0] * vec4(texcoord0,0,1);
|
||||
gl_FrontColor = diffuse_color;
|
||||
}
|
||||
|
||||
|
|
|
|||
Binary file not shown.
|
|
@ -0,0 +1,33 @@
|
|||
/**
|
||||
* @file emissiveSkinnedV.glsl
|
||||
*
|
||||
* Copyright (c) 2007-$CurrentYear$, Linden Research, Inc.
|
||||
* $License$
|
||||
*/
|
||||
|
||||
|
||||
attribute vec3 position;
|
||||
attribute float emissive;
|
||||
attribute vec2 texcoord0;
|
||||
|
||||
void calcAtmospherics(vec3 inPositionEye);
|
||||
mat4 getObjectSkinnedTransform();
|
||||
|
||||
void main()
|
||||
{
|
||||
//transform vertex
|
||||
gl_TexCoord[0] = gl_TextureMatrix[0] * vec4(texcoord0,0,1);
|
||||
|
||||
mat4 mat = getObjectSkinnedTransform();
|
||||
|
||||
mat = gl_ModelViewMatrix * mat;
|
||||
vec3 pos = (mat*vec4(position.xyz, 1.0)).xyz;
|
||||
|
||||
calcAtmospherics(pos.xyz);
|
||||
|
||||
gl_FrontColor = vec4(0,0,0,emissive);
|
||||
|
||||
gl_Position = gl_ProjectionMatrix*vec4(pos, 1.0);
|
||||
|
||||
gl_FogFragCoord = pos.z;
|
||||
}
|
||||
|
|
@ -0,0 +1,29 @@
|
|||
/**
|
||||
* @file emissiveV.glsl
|
||||
*
|
||||
* $LicenseInfo:firstyear=2007&license=viewerlgpl$
|
||||
* $/LicenseInfo$
|
||||
*/
|
||||
|
||||
attribute vec4 position;
|
||||
attribute float emissive;
|
||||
attribute vec2 texcoord0;
|
||||
|
||||
void calcAtmospherics(vec3 inPositionEye);
|
||||
|
||||
varying float vary_texture_index;
|
||||
|
||||
void main()
|
||||
{
|
||||
//transform vertex
|
||||
vary_texture_index = position.w;
|
||||
gl_Position = gl_ModelViewProjectionMatrix * vec4(position.xyz, 1.0);
|
||||
gl_TexCoord[0] = gl_TextureMatrix[0] * vec4(texcoord0,0,1);
|
||||
|
||||
vec4 pos = (gl_ModelViewMatrix * vec4(position.xyz, 1.0));
|
||||
calcAtmospherics(pos.xyz);
|
||||
|
||||
gl_FrontColor = vec4(0,0,0,emissive);
|
||||
|
||||
gl_FogFragCoord = pos.z;
|
||||
}
|
||||
|
|
@ -0,0 +1,27 @@
|
|||
/**
|
||||
* @file fullbrightNoColorV.glsl
|
||||
*
|
||||
* $LicenseInfo:firstyear=2007&license=viewerlgpl$
|
||||
* $/LicenseInfo$
|
||||
*/
|
||||
|
||||
attribute vec3 position;
|
||||
attribute vec2 texcoord0;
|
||||
attribute vec3 normal;
|
||||
|
||||
void calcAtmospherics(vec3 inPositionEye);
|
||||
|
||||
void main()
|
||||
{
|
||||
//transform vertex
|
||||
vec4 vert = vec4(position.xyz,1.0);
|
||||
vec4 pos = (gl_ModelViewMatrix * vert);
|
||||
gl_Position = gl_ModelViewProjectionMatrix*vec4(position.xyz, 1.0);
|
||||
gl_TexCoord[0] = gl_TextureMatrix[0] * vec4(texcoord0,0,1);
|
||||
|
||||
calcAtmospherics(pos.xyz);
|
||||
|
||||
gl_FrontColor = vec4(1,1,1,1);
|
||||
|
||||
gl_FogFragCoord = pos.z;
|
||||
}
|
||||
|
|
@ -0,0 +1,30 @@
|
|||
/**
|
||||
* @file simpleNoColorV.glsl
|
||||
*
|
||||
* $LicenseInfo:firstyear=2007&license=viewerlgpl$
|
||||
* $/LicenseInfo$
|
||||
*/
|
||||
|
||||
attribute vec3 position;
|
||||
attribute vec3 normal;
|
||||
attribute vec2 texcoord0;
|
||||
|
||||
vec4 calcLighting(vec3 pos, vec3 norm, vec4 color, vec4 baseCol);
|
||||
void calcAtmospherics(vec3 inPositionEye);
|
||||
|
||||
void main()
|
||||
{
|
||||
//transform vertex
|
||||
vec4 pos = (gl_ModelViewMatrix * vec4(position.xyz, 1.0));
|
||||
gl_Position = gl_ModelViewProjectionMatrix * vec4(position.xyz, 1.0);
|
||||
gl_TexCoord[0] = gl_TextureMatrix[0] * vec4(texcoord0,0,1);
|
||||
|
||||
vec3 norm = normalize(gl_NormalMatrix * normal);
|
||||
|
||||
calcAtmospherics(pos.xyz);
|
||||
|
||||
vec4 color = calcLighting(pos.xyz, norm, vec4(1,1,1,1), vec4(0.));
|
||||
gl_FrontColor = color;
|
||||
|
||||
gl_FogFragCoord = pos.z;
|
||||
}
|
||||
|
|
@ -0,0 +1,35 @@
|
|||
/**
|
||||
* @file treeV.glsl
|
||||
*
|
||||
* $LicenseInfo:firstyear=2007&license=viewerlgpl$
|
||||
* $/LicenseInfo$
|
||||
*/
|
||||
|
||||
|
||||
|
||||
attribute vec3 position;
|
||||
attribute vec2 texcoord0;
|
||||
attribute vec3 normal;
|
||||
|
||||
vec4 calcLighting(vec3 pos, vec3 norm, vec4 color, vec4 baseCol);
|
||||
void calcAtmospherics(vec3 inPositionEye);
|
||||
|
||||
void main()
|
||||
{
|
||||
//transform vertex
|
||||
vec4 vert = vec4(position.xyz,1.0);
|
||||
|
||||
gl_Position = gl_ModelViewProjectionMatrix*vert;
|
||||
gl_TexCoord[0] = gl_TextureMatrix[0] * vec4(texcoord0, 0, 1);
|
||||
|
||||
vec4 pos = (gl_ModelViewMatrix * vert);
|
||||
|
||||
vec3 norm = normalize(gl_NormalMatrix * normal);
|
||||
|
||||
calcAtmospherics(pos.xyz);
|
||||
|
||||
vec4 color = calcLighting(pos.xyz, norm, vec4(1,1,1,1), vec4(0.));
|
||||
gl_FrontColor = color;
|
||||
|
||||
gl_FogFragCoord = pos.z;
|
||||
}
|
||||
|
|
@ -0,0 +1,121 @@
|
|||
/**
|
||||
* @file alphaNonIndexedNoColorF.glsl
|
||||
*
|
||||
* $LicenseInfo:firstyear=2007&license=viewerlgpl$
|
||||
* $/LicenseInfo$
|
||||
*/
|
||||
|
||||
|
||||
|
||||
#extension GL_ARB_texture_rectangle : enable
|
||||
|
||||
uniform sampler2DRectShadow shadowMap0;
|
||||
uniform sampler2DRectShadow shadowMap1;
|
||||
uniform sampler2DRectShadow shadowMap2;
|
||||
uniform sampler2DRectShadow shadowMap3;
|
||||
uniform sampler2DRect depthMap;
|
||||
uniform sampler2D diffuseMap;
|
||||
|
||||
uniform mat4 shadow_matrix[6];
|
||||
uniform vec4 shadow_clip;
|
||||
uniform vec2 screen_res;
|
||||
uniform vec2 shadow_res;
|
||||
|
||||
vec3 atmosLighting(vec3 light);
|
||||
vec3 scaleSoftClip(vec3 light);
|
||||
|
||||
varying vec3 vary_ambient;
|
||||
varying vec3 vary_directional;
|
||||
varying vec3 vary_fragcoord;
|
||||
varying vec3 vary_position;
|
||||
varying vec3 vary_pointlight_col;
|
||||
|
||||
uniform float shadow_bias;
|
||||
|
||||
uniform mat4 inv_proj;
|
||||
|
||||
vec4 getPosition(vec2 pos_screen)
|
||||
{
|
||||
float depth = texture2DRect(depthMap, pos_screen.xy).a;
|
||||
vec2 sc = pos_screen.xy*2.0;
|
||||
sc /= screen_res;
|
||||
sc -= vec2(1.0,1.0);
|
||||
vec4 ndc = vec4(sc.x, sc.y, 2.0*depth-1.0, 1.0);
|
||||
vec4 pos = inv_proj * ndc;
|
||||
pos.xyz /= pos.w;
|
||||
pos.w = 1.0;
|
||||
return pos;
|
||||
}
|
||||
|
||||
float pcfShadow(sampler2DRectShadow shadowMap, vec4 stc, float scl)
|
||||
{
|
||||
stc.xyz /= stc.w;
|
||||
stc.z += shadow_bias;
|
||||
|
||||
float cs = shadow2DRect(shadowMap, stc.xyz).x;
|
||||
float shadow = cs;
|
||||
|
||||
shadow += max(shadow2DRect(shadowMap, stc.xyz+vec3(scl, scl, 0.0)).x, cs);
|
||||
shadow += max(shadow2DRect(shadowMap, stc.xyz+vec3(scl, -scl, 0.0)).x, cs);
|
||||
shadow += max(shadow2DRect(shadowMap, stc.xyz+vec3(-scl, scl, 0.0)).x, cs);
|
||||
shadow += max(shadow2DRect(shadowMap, stc.xyz+vec3(-scl, -scl, 0.0)).x, cs);
|
||||
|
||||
return shadow/5.0;
|
||||
}
|
||||
|
||||
|
||||
void main()
|
||||
{
|
||||
vec2 frag = vary_fragcoord.xy/vary_fragcoord.z*0.5+0.5;
|
||||
frag *= screen_res;
|
||||
|
||||
float shadow = 1.0;
|
||||
vec4 pos = vec4(vary_position, 1.0);
|
||||
|
||||
vec4 spos = pos;
|
||||
|
||||
if (spos.z > -shadow_clip.w)
|
||||
{
|
||||
vec4 lpos;
|
||||
|
||||
if (spos.z < -shadow_clip.z)
|
||||
{
|
||||
lpos = shadow_matrix[3]*spos;
|
||||
lpos.xy *= shadow_res;
|
||||
shadow = pcfShadow(shadowMap3, lpos, 1.5);
|
||||
shadow += max((pos.z+shadow_clip.z)/(shadow_clip.z-shadow_clip.w)*2.0-1.0, 0.0);
|
||||
}
|
||||
else if (spos.z < -shadow_clip.y)
|
||||
{
|
||||
lpos = shadow_matrix[2]*spos;
|
||||
lpos.xy *= shadow_res;
|
||||
shadow = pcfShadow(shadowMap2, lpos, 1.5);
|
||||
}
|
||||
else if (spos.z < -shadow_clip.x)
|
||||
{
|
||||
lpos = shadow_matrix[1]*spos;
|
||||
lpos.xy *= shadow_res;
|
||||
shadow = pcfShadow(shadowMap1, lpos, 1.5);
|
||||
}
|
||||
else
|
||||
{
|
||||
lpos = shadow_matrix[0]*spos;
|
||||
lpos.xy *= shadow_res;
|
||||
shadow = pcfShadow(shadowMap0, lpos, 1.5);
|
||||
}
|
||||
}
|
||||
|
||||
vec4 diff = texture2D(diffuseMap,gl_TexCoord[0].xy);
|
||||
|
||||
vec4 col = vec4(vary_ambient + vary_directional.rgb*shadow, 1.0);
|
||||
vec4 color = diff * col;
|
||||
|
||||
color.rgb = atmosLighting(color.rgb);
|
||||
|
||||
color.rgb = scaleSoftClip(color.rgb);
|
||||
|
||||
color.rgb += diff.rgb * vary_pointlight_col.rgb;
|
||||
|
||||
gl_FragColor = color;
|
||||
}
|
||||
|
||||
|
|
@ -68,11 +68,11 @@ void main()
|
|||
|
||||
mat = gl_ModelViewMatrix * mat;
|
||||
|
||||
vec3 pos = (mat*position).xyz;
|
||||
vec3 pos = (mat*vec4(position, 1.0)).xyz;
|
||||
|
||||
gl_Position = gl_ProjectionMatrix * vec4(pos, 1.0);
|
||||
|
||||
vec4 n = position;
|
||||
vec4 n = vec4(position, 1.0);
|
||||
n.xyz += normal.xyz;
|
||||
n.xyz = (mat*n).xyz;
|
||||
n.xyz = normalize(n.xyz-pos.xyz);
|
||||
|
|
|
|||
|
|
@ -8,7 +8,6 @@
|
|||
|
||||
attribute vec3 position;
|
||||
attribute vec3 normal;
|
||||
attribute vec4 diffuse_color;
|
||||
attribute vec2 texcoord0;
|
||||
|
||||
vec4 calcLighting(vec3 pos, vec3 norm, vec4 color, vec4 baseCol);
|
||||
|
|
@ -89,9 +88,7 @@ void main()
|
|||
|
||||
calcAtmospherics(pos.xyz);
|
||||
|
||||
//vec4 color = calcLighting(pos.xyz, norm, diffuse_color, vec4(0.));
|
||||
|
||||
vec4 col = vec4(0.0, 0.0, 0.0, diffuse_color.a);
|
||||
vec4 col = vec4(0.0, 0.0, 0.0, 1.0);
|
||||
|
||||
// Collect normal lights
|
||||
col.rgb += gl_LightSource[2].diffuse.rgb*calcPointLightOrSpotLight(pos.xyz, norm, gl_LightSource[2].position, gl_LightSource[2].spotDirection.xyz, gl_LightSource[2].linearAttenuation, gl_LightSource[2].quadraticAttenuation, gl_LightSource[2].specular.a);
|
||||
|
|
@ -101,17 +98,17 @@ void main()
|
|||
col.rgb += gl_LightSource[6].diffuse.rgb*calcPointLightOrSpotLight(pos.xyz, norm, gl_LightSource[6].position, gl_LightSource[6].spotDirection.xyz, gl_LightSource[6].linearAttenuation, gl_LightSource[6].quadraticAttenuation, gl_LightSource[6].specular.a);
|
||||
col.rgb += gl_LightSource[7].diffuse.rgb*calcPointLightOrSpotLight(pos.xyz, norm, gl_LightSource[7].position, gl_LightSource[7].spotDirection.xyz, gl_LightSource[7].linearAttenuation, gl_LightSource[7].quadraticAttenuation, gl_LightSource[7].specular.a);
|
||||
|
||||
vary_pointlight_col = col.rgb*diffuse_color.rgb;
|
||||
vary_pointlight_col = col.rgb;
|
||||
|
||||
col.rgb = vec3(0,0,0);
|
||||
|
||||
// Add windlight lights
|
||||
col.rgb = atmosAmbient(vec3(0.));
|
||||
|
||||
vary_ambient = col.rgb*diffuse_color.rgb;
|
||||
vary_directional = diffuse_color.rgb*atmosAffectDirectionalLight(max(calcDirectionalLight(norm, gl_LightSource[0].position.xyz), (1.0-diffuse_color.a)*(1.0-diffuse_color.a)));
|
||||
vary_ambient = col.rgb;
|
||||
vary_directional = atmosAffectDirectionalLight(max(calcDirectionalLight(norm, gl_LightSource[0].position.xyz), 0.0));
|
||||
|
||||
col.rgb = min(col.rgb*diffuse_color.rgb, 1.0);
|
||||
col.rgb = min(col.rgb, 1.0);
|
||||
|
||||
gl_FrontColor = col;
|
||||
|
||||
|
|
|
|||
|
|
@ -36,7 +36,10 @@ uniform float sun_wash;
|
|||
uniform int proj_shadow_idx;
|
||||
uniform float shadow_fade;
|
||||
|
||||
varying vec4 vary_light;
|
||||
uniform vec3 center;
|
||||
uniform float size;
|
||||
uniform vec3 color;
|
||||
uniform float falloff;
|
||||
|
||||
varying vec4 vary_fragcoord;
|
||||
uniform vec2 screen_res;
|
||||
|
|
@ -110,9 +113,9 @@ void main()
|
|||
frag.xy *= screen_res;
|
||||
|
||||
vec3 pos = getPosition(frag.xy).xyz;
|
||||
vec3 lv = vary_light.xyz-pos.xyz;
|
||||
vec3 lv = center.xyz-pos.xyz;
|
||||
float dist2 = dot(lv,lv);
|
||||
dist2 /= vary_light.w;
|
||||
dist2 /= size;
|
||||
if (dist2 > 1.0)
|
||||
{
|
||||
discard;
|
||||
|
|
@ -143,7 +146,7 @@ void main()
|
|||
|
||||
proj_tc.xyz /= proj_tc.w;
|
||||
|
||||
float fa = gl_Color.a+1.0;
|
||||
float fa = falloff+1.0;
|
||||
float dist_atten = min(1.0-(dist2-1.0*(1.0-fa))/fa, 1.0);
|
||||
if (dist_atten <= 0.0)
|
||||
{
|
||||
|
|
@ -175,7 +178,7 @@ void main()
|
|||
|
||||
vec4 plcol = texture2DLodDiffuse(projectionMap, proj_tc.xy, lod);
|
||||
|
||||
vec3 lcol = gl_Color.rgb * plcol.rgb * plcol.a;
|
||||
vec3 lcol = color.rgb * plcol.rgb * plcol.a;
|
||||
|
||||
lit = da * dist_atten * noise;
|
||||
|
||||
|
|
@ -192,7 +195,7 @@ void main()
|
|||
|
||||
amb_da = min(amb_da, 1.0-lit);
|
||||
|
||||
col += amb_da*gl_Color.rgb*diff_tex.rgb*amb_plcol.rgb*amb_plcol.a;
|
||||
col += amb_da*color.rgb*diff_tex.rgb*amb_plcol.rgb*amb_plcol.a;
|
||||
}
|
||||
|
||||
|
||||
|
|
@ -225,7 +228,7 @@ void main()
|
|||
stc.y > 0.0)
|
||||
{
|
||||
vec4 scol = texture2DLodSpecular(projectionMap, stc.xy, proj_lod-spec.a*proj_lod);
|
||||
col += dist_atten*scol.rgb*gl_Color.rgb*scol.a*spec.rgb*shadow;
|
||||
col += dist_atten*scol.rgb*color.rgb*scol.a*spec.rgb*shadow;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -47,7 +47,8 @@ uniform mat3 ssao_effect_mat;
|
|||
uniform mat4 inv_proj;
|
||||
uniform vec2 screen_res;
|
||||
|
||||
varying vec4 vary_light;
|
||||
uniform vec3 sun_dir;
|
||||
|
||||
varying vec2 vary_fragcoord;
|
||||
|
||||
vec3 vary_PositionEye;
|
||||
|
|
@ -264,7 +265,7 @@ void main()
|
|||
norm = vec3((norm.xy-0.5)*2.0,norm.z); // unpack norm
|
||||
//vec3 nz = texture2D(noiseMap, vary_fragcoord.xy/128.0).xyz;
|
||||
|
||||
float da = max(dot(norm.xyz, vary_light.xyz), 0.0);
|
||||
float da = max(dot(norm.xyz, sun_dir.xyz), 0.0);
|
||||
|
||||
vec4 diffuse = texture2DRect(diffuseRect, tc);
|
||||
|
||||
|
|
@ -291,7 +292,7 @@ void main()
|
|||
// the old infinite-sky shiny reflection
|
||||
//
|
||||
vec3 refnormpersp = normalize(reflect(pos.xyz, norm.xyz));
|
||||
float sa = dot(refnormpersp, vary_light.xyz);
|
||||
float sa = dot(refnormpersp, sun_dir.xyz);
|
||||
vec3 dumbshiny = vary_SunlitColor*scol_ambocc.r*texture2D(lightFunc, vec2(sa, spec.a)).a;
|
||||
|
||||
// add the two types of shiny together
|
||||
|
|
|
|||
|
|
@ -7,12 +7,11 @@
|
|||
|
||||
|
||||
attribute vec3 position;
|
||||
attribute vec2 texcoord0;
|
||||
|
||||
uniform vec2 screen_res;
|
||||
|
||||
varying vec4 vary_light;
|
||||
varying vec2 vary_fragcoord;
|
||||
|
||||
void main()
|
||||
{
|
||||
//transform vertex
|
||||
|
|
@ -21,6 +20,4 @@ void main()
|
|||
|
||||
|
||||
vary_fragcoord = (pos.xy*0.5+0.5)*screen_res;
|
||||
|
||||
vary_light = vec4(texcoord0,0,1);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -30,7 +30,7 @@ uniform float ssao_factor;
|
|||
uniform float ssao_factor_inv;
|
||||
|
||||
varying vec2 vary_fragcoord;
|
||||
varying vec4 vary_light;
|
||||
uniform vec3 sun_dir;
|
||||
|
||||
uniform mat4 inv_proj;
|
||||
uniform vec2 screen_res;
|
||||
|
|
@ -167,10 +167,10 @@ void main()
|
|||
}*/
|
||||
|
||||
float shadow = 1.0;
|
||||
float dp_directional_light = max(0.0, dot(norm, vary_light.xyz));
|
||||
float dp_directional_light = max(0.0, dot(norm, sun_dir.xyz));
|
||||
|
||||
vec3 shadow_pos = pos.xyz + displace*norm;
|
||||
vec3 offset = vary_light.xyz * (1.0-dp_directional_light);
|
||||
vec3 offset = sun_dir.xyz * (1.0-dp_directional_light);
|
||||
|
||||
vec4 spos = vec4(shadow_pos+offset*shadow_offset, 1.0);
|
||||
|
||||
|
|
|
|||
|
|
@ -6,9 +6,6 @@
|
|||
*/
|
||||
|
||||
attribute vec3 position;
|
||||
attribute vec3 normal;
|
||||
attribute vec4 diffuse_color;
|
||||
attribute vec2 texcoord0;
|
||||
|
||||
|
||||
varying vec4 vary_light;
|
||||
|
|
@ -23,10 +20,4 @@ void main()
|
|||
gl_Position = pos;
|
||||
|
||||
vary_fragcoord = (pos.xy * 0.5 + 0.5)*screen_res;
|
||||
vec4 tex = vec4(texcoord0,0,1);
|
||||
tex.w = 1.0;
|
||||
|
||||
vary_light = vec4(texcoord0,0,1);
|
||||
|
||||
gl_FrontColor = diffuse_color;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -0,0 +1,36 @@
|
|||
/**
|
||||
* @file simpleNonIndexedV.glsl
|
||||
*
|
||||
* $LicenseInfo:firstyear=2007&license=viewerlgpl$
|
||||
* $/LicenseInfo$
|
||||
*/
|
||||
|
||||
|
||||
|
||||
attribute vec3 position;
|
||||
attribute vec2 texcoord0;
|
||||
attribute vec3 normal;
|
||||
attribute vec4 diffuse_color;
|
||||
|
||||
vec4 calcLighting(vec3 pos, vec3 norm, vec4 color, vec4 baseCol);
|
||||
void calcAtmospherics(vec3 inPositionEye);
|
||||
|
||||
void main()
|
||||
{
|
||||
//transform vertex
|
||||
vec4 vert = vec4(position.xyz,1.0);
|
||||
|
||||
gl_Position = gl_ModelViewProjectionMatrix*vert;
|
||||
gl_TexCoord[0] = gl_TextureMatrix[0] * vec4(texcoord0, 0, 1);
|
||||
|
||||
vec4 pos = (gl_ModelViewMatrix * vert);
|
||||
|
||||
vec3 norm = normalize(gl_NormalMatrix * normal);
|
||||
|
||||
calcAtmospherics(pos.xyz);
|
||||
|
||||
vec4 color = calcLighting(pos.xyz, norm, diffuse_color, vec4(0.));
|
||||
gl_FrontColor = color;
|
||||
|
||||
gl_FogFragCoord = pos.z;
|
||||
}
|
||||
|
|
@ -3925,7 +3925,7 @@ void LLAgent::renderAutoPilotTarget()
|
|||
gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
|
||||
|
||||
// lovely green
|
||||
gGL.diffuseColor4f(0.f, 1.f, 1.f, 1.f);
|
||||
gGL.color4f(0.f, 1.f, 1.f, 1.f);
|
||||
|
||||
target_global = mAutoPilotTargetGlobal;
|
||||
|
||||
|
|
@ -3935,7 +3935,7 @@ void LLAgent::renderAutoPilotTarget()
|
|||
|
||||
glScalef(height_meters, height_meters, height_meters);
|
||||
|
||||
gSphere.render(1500.f);
|
||||
gSphere.render();
|
||||
|
||||
gGL.popMatrix();
|
||||
}
|
||||
|
|
|
|||
|
|
@ -37,261 +37,39 @@
|
|||
#include "llgl.h"
|
||||
#include "llglheaders.h"
|
||||
|
||||
LLCylinder gCylinder;
|
||||
LLCone gCone;
|
||||
|
||||
GLUquadricObj* gQuadObj = NULL;
|
||||
|
||||
static const GLint SLICES[] = { 30, 20, 12, 6 }; // same as sphere slices
|
||||
static const GLint STACKS = 2;
|
||||
static const GLfloat RADIUS = 0.5f;
|
||||
|
||||
// draws a cylinder or cone
|
||||
// returns approximate number of triangles required
|
||||
U32 draw_cylinder_side(GLint slices, GLint stacks, GLfloat base_radius, GLfloat top_radius)
|
||||
{
|
||||
U32 triangles = 0;
|
||||
GLfloat height = 1.0f;
|
||||
|
||||
if (!gQuadObj)
|
||||
{
|
||||
gQuadObj = gluNewQuadric();
|
||||
if (!gQuadObj) llerror("draw_cylindrical_body couldn't allocated quadric", 0);
|
||||
}
|
||||
|
||||
gluQuadricDrawStyle(gQuadObj, GLU_FILL);
|
||||
gluQuadricNormals(gQuadObj, GLU_SMOOTH);
|
||||
gluQuadricOrientation(gQuadObj, GLU_OUTSIDE);
|
||||
gluQuadricTexture(gQuadObj, GL_TRUE);
|
||||
gluCylinder(gQuadObj, base_radius, top_radius, height, slices, stacks);
|
||||
triangles += stacks * (slices * 2);
|
||||
|
||||
|
||||
return triangles;
|
||||
}
|
||||
|
||||
|
||||
// Returns number of triangles required to draw
|
||||
// Need to know if top or not to set lighting normals
|
||||
const BOOL TOP = TRUE;
|
||||
const BOOL BOTTOM = FALSE;
|
||||
U32 draw_cylinder_cap(GLint slices, GLfloat base_radius, BOOL is_top)
|
||||
{
|
||||
U32 triangles = 0;
|
||||
|
||||
if (!gQuadObj)
|
||||
{
|
||||
gQuadObj = gluNewQuadric();
|
||||
if (!gQuadObj) llerror("draw_cylinder_base couldn't allocated quadric", 0);
|
||||
}
|
||||
|
||||
gluQuadricDrawStyle(gQuadObj, GLU_FILL);
|
||||
gluQuadricNormals(gQuadObj, GLU_SMOOTH);
|
||||
gluQuadricOrientation(gQuadObj, GLU_OUTSIDE);
|
||||
gluQuadricTexture(gQuadObj, GL_TRUE);
|
||||
|
||||
// no hole in the middle of the disk, and just one ring
|
||||
GLdouble inner_radius = 0.0;
|
||||
GLint rings = 1;
|
||||
|
||||
// normals point in +z for top, -z for base
|
||||
if (is_top)
|
||||
{
|
||||
gluQuadricOrientation(gQuadObj, GLU_OUTSIDE);
|
||||
}
|
||||
else
|
||||
{
|
||||
gluQuadricOrientation(gQuadObj, GLU_INSIDE);
|
||||
}
|
||||
gluDisk(gQuadObj, inner_radius, base_radius, slices, rings);
|
||||
triangles += slices;
|
||||
|
||||
return triangles;
|
||||
}
|
||||
|
||||
void LLCylinder::drawSide(S32 detail)
|
||||
{
|
||||
draw_cylinder_side(SLICES[detail], STACKS, RADIUS, RADIUS);
|
||||
}
|
||||
|
||||
void LLCylinder::drawTop(S32 detail)
|
||||
{
|
||||
draw_cylinder_cap(SLICES[detail], RADIUS, TOP);
|
||||
}
|
||||
|
||||
void LLCylinder::drawBottom(S32 detail)
|
||||
{
|
||||
draw_cylinder_cap(SLICES[detail], RADIUS, BOTTOM);
|
||||
}
|
||||
|
||||
void LLCylinder::prerender()
|
||||
{
|
||||
}
|
||||
|
||||
void LLCylinder::cleanupGL()
|
||||
{
|
||||
if (gQuadObj)
|
||||
{
|
||||
gluDeleteQuadric(gQuadObj);
|
||||
gQuadObj = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
void LLCylinder::render(F32 pixel_area)
|
||||
{
|
||||
renderface(pixel_area, 0);
|
||||
renderface(pixel_area, 1);
|
||||
renderface(pixel_area, 2);
|
||||
}
|
||||
|
||||
|
||||
void LLCylinder::renderface(F32 pixel_area, S32 face)
|
||||
{
|
||||
if (face < 0 || face > 2)
|
||||
{
|
||||
llerror("LLCylinder::renderface() invalid face number", face);
|
||||
return;
|
||||
}
|
||||
|
||||
glMatrixMode(GL_MODELVIEW);
|
||||
glPushMatrix();
|
||||
|
||||
S32 level_of_detail;
|
||||
|
||||
if (pixel_area > 20000.f)
|
||||
{
|
||||
level_of_detail = 0;
|
||||
}
|
||||
else if (pixel_area > 1600.f)
|
||||
{
|
||||
level_of_detail = 1;
|
||||
}
|
||||
else if (pixel_area > 200.f)
|
||||
{
|
||||
level_of_detail = 2;
|
||||
}
|
||||
else
|
||||
{
|
||||
level_of_detail = 3;
|
||||
}
|
||||
|
||||
if (level_of_detail < 0 || CYLINDER_LEVELS_OF_DETAIL <= level_of_detail)
|
||||
{
|
||||
llerror("LLCylinder::renderface() invalid level of detail", level_of_detail);
|
||||
return;
|
||||
}
|
||||
|
||||
LLVertexBuffer::unbind();
|
||||
|
||||
switch(face)
|
||||
{
|
||||
case 0:
|
||||
glTranslatef(0.f, 0.f, -0.5f);
|
||||
drawSide(level_of_detail);
|
||||
break;
|
||||
case 1:
|
||||
glTranslatef(0.0f, 0.f, 0.5f);
|
||||
drawTop(level_of_detail);
|
||||
break;
|
||||
case 2:
|
||||
glTranslatef(0.0f, 0.f, -0.5f);
|
||||
drawBottom(level_of_detail);
|
||||
break;
|
||||
default:
|
||||
llerror("LLCylinder::renderface() fell out of switch", 0);
|
||||
break;
|
||||
}
|
||||
|
||||
glMatrixMode(GL_MODELVIEW);
|
||||
glPopMatrix();
|
||||
}
|
||||
|
||||
|
||||
//
|
||||
// Cones
|
||||
//
|
||||
|
||||
void LLCone::prerender()
|
||||
void LLCone::render(S32 sides)
|
||||
{
|
||||
}
|
||||
gGL.begin(LLRender::TRIANGLE_FAN);
|
||||
gGL.vertex3f(0,0,0);
|
||||
|
||||
void LLCone::cleanupGL()
|
||||
{
|
||||
if (gQuadObj)
|
||||
for (U32 i = 0; i < sides; i++)
|
||||
{
|
||||
gluDeleteQuadric(gQuadObj);
|
||||
gQuadObj = NULL;
|
||||
F32 a = (F32) i/sides * F_PI*2.f;
|
||||
F32 x = cosf(a)*0.5f;
|
||||
F32 y = sinf(a)*0.5f;
|
||||
gGL.vertex3f(x,y,0.f);
|
||||
}
|
||||
}
|
||||
gGL.vertex3f(cosf(0.f)*0.5f, sinf(0.f)*0.5f, 0.f);
|
||||
|
||||
void LLCone::drawSide(S32 detail)
|
||||
{
|
||||
draw_cylinder_side( SLICES[detail], STACKS, RADIUS, 0.f );
|
||||
}
|
||||
gGL.end();
|
||||
|
||||
void LLCone::drawBottom(S32 detail)
|
||||
{
|
||||
draw_cylinder_cap( SLICES[detail], RADIUS, BOTTOM );
|
||||
}
|
||||
|
||||
void LLCone::render(S32 level_of_detail)
|
||||
{
|
||||
GLfloat height = 1.0f;
|
||||
|
||||
if (level_of_detail < 0 || CONE_LEVELS_OF_DETAIL <= level_of_detail)
|
||||
gGL.begin(LLRender::TRIANGLE_FAN);
|
||||
gGL.vertex3f(0.f, 0.f, 1.f);
|
||||
for (U32 i = 0; i < sides; i++)
|
||||
{
|
||||
llerror("LLCone::render() invalid level of detail", level_of_detail);
|
||||
return;
|
||||
F32 a = (F32) i/sides * F_PI*2.f;
|
||||
F32 x = cosf(a)*0.5f;
|
||||
F32 y = sinf(a)*0.5f;
|
||||
gGL.vertex3f(x,y,0.f);
|
||||
}
|
||||
gGL.vertex3f(cosf(0.f)*0.5f, sinf(0.f)*0.5f, 0.f);
|
||||
|
||||
glMatrixMode(GL_MODELVIEW);
|
||||
glPushMatrix();
|
||||
|
||||
// center object at 0
|
||||
glTranslatef(0.f, 0.f, - height / 2.0f);
|
||||
|
||||
drawSide(level_of_detail);
|
||||
drawBottom(level_of_detail);
|
||||
|
||||
glMatrixMode(GL_MODELVIEW);
|
||||
glPopMatrix();
|
||||
gGL.end();
|
||||
}
|
||||
|
||||
|
||||
void LLCone::renderface(S32 level_of_detail, S32 face)
|
||||
{
|
||||
if (face < 0 || face > 1)
|
||||
{
|
||||
llerror("LLCone::renderface() invalid face number", face);
|
||||
return;
|
||||
}
|
||||
|
||||
if (level_of_detail < 0 || CONE_LEVELS_OF_DETAIL <= level_of_detail)
|
||||
{
|
||||
llerror("LLCone::renderface() invalid level of detail", level_of_detail);
|
||||
return;
|
||||
}
|
||||
|
||||
glMatrixMode(GL_MODELVIEW);
|
||||
glPushMatrix();
|
||||
|
||||
LLVertexBuffer::unbind();
|
||||
|
||||
switch(face)
|
||||
{
|
||||
case 0:
|
||||
glTranslatef(0.f, 0.f, -0.5f);
|
||||
drawSide(level_of_detail);
|
||||
break;
|
||||
case 1:
|
||||
glTranslatef(0.f, 0.f, -0.5f);
|
||||
drawBottom(level_of_detail);
|
||||
break;
|
||||
default:
|
||||
llerror("LLCylinder::renderface() fell out of switch", 0);
|
||||
break;
|
||||
}
|
||||
|
||||
glMatrixMode(GL_MODELVIEW);
|
||||
glPopMatrix();
|
||||
}
|
||||
|
|
|
|||
|
|
@ -30,45 +30,18 @@
|
|||
//#include "stdtypes.h"
|
||||
//#include "llgl.h"
|
||||
|
||||
//
|
||||
// Cylinders
|
||||
//
|
||||
const S32 CYLINDER_LEVELS_OF_DETAIL = 4;
|
||||
const S32 CYLINDER_FACES = 3;
|
||||
|
||||
class LLCylinder
|
||||
{
|
||||
public:
|
||||
void prerender();
|
||||
void drawTop(S32 detail);
|
||||
void drawSide(S32 detail);
|
||||
void drawBottom(S32 detail);
|
||||
void cleanupGL();
|
||||
|
||||
void render(F32 pixel_area);
|
||||
void renderface(F32 pixel_area, S32 face);
|
||||
};
|
||||
|
||||
#include "llvertexbuffer.h"
|
||||
|
||||
//
|
||||
// Cones
|
||||
//
|
||||
|
||||
const S32 CONE_LOD_HIGHEST = 0;
|
||||
const S32 CONE_LEVELS_OF_DETAIL = 4;
|
||||
const S32 CONE_FACES = 2;
|
||||
|
||||
class LLCone
|
||||
{
|
||||
public:
|
||||
void prerender();
|
||||
void cleanupGL();
|
||||
void drawSide(S32 detail);
|
||||
void drawBottom(S32 detail);
|
||||
void render(S32 level_of_detail);
|
||||
void renderface(S32 level_of_detail, S32 face);
|
||||
void render(S32 sides = 12);
|
||||
};
|
||||
|
||||
extern LLCylinder gCylinder;
|
||||
|
||||
extern LLCone gCone;
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -492,7 +492,8 @@ void LLDrawPoolAlpha::renderAlpha(U32 mask)
|
|||
gPipeline.addTrianglesDrawn(params.mCount, params.mDrawMode);
|
||||
|
||||
// If this alpha mesh has glow, then draw it a second time to add the destination-alpha (=glow). Interleaving these state-changing calls could be expensive, but glow must be drawn Z-sorted with alpha.
|
||||
if (draw_glow_for_this_partition &&
|
||||
if (current_shader &&
|
||||
draw_glow_for_this_partition &&
|
||||
params.mVertexBuffer->hasDataType(LLVertexBuffer::TYPE_EMISSIVE))
|
||||
{
|
||||
// install glow-accumulating blend mode
|
||||
|
|
|
|||
|
|
@ -270,7 +270,6 @@ void LLDrawPoolAvatar::beginDeferredRiggedAlpha()
|
|||
sVertexProgram = &gDeferredSkinnedAlphaProgram;
|
||||
gPipeline.bindDeferredShader(*sVertexProgram);
|
||||
sDiffuseChannel = sVertexProgram->enableTexture(LLViewerShaderMgr::DIFFUSE_MAP);
|
||||
LLVertexBuffer::sWeight4Loc = sVertexProgram->getAttribLocation(LLViewerShaderMgr::OBJECT_WEIGHT);
|
||||
gPipeline.enableLightsDynamic();
|
||||
}
|
||||
|
||||
|
|
@ -279,7 +278,6 @@ void LLDrawPoolAvatar::endDeferredRiggedAlpha()
|
|||
LLVertexBuffer::unbind();
|
||||
gPipeline.unbindDeferredShader(*sVertexProgram);
|
||||
sDiffuseChannel = 0;
|
||||
LLVertexBuffer::sWeight4Loc = -1;
|
||||
sVertexProgram = NULL;
|
||||
}
|
||||
|
||||
|
|
@ -354,10 +352,7 @@ void LLDrawPoolAvatar::beginShadowPass(S32 pass)
|
|||
if (pass == 0)
|
||||
{
|
||||
sVertexProgram = &gDeferredAvatarShadowProgram;
|
||||
if (sShaderLevel > 0)
|
||||
{
|
||||
gAvatarMatrixParam = sVertexProgram->mUniform[LLViewerShaderMgr::AVATAR_MATRIX];
|
||||
}
|
||||
|
||||
//gGL.setAlphaRejectSettings(LLRender::CF_GREATER_EQUAL, 0.2f);
|
||||
|
||||
gGL.diffuseColor4f(1,1,1,1);
|
||||
|
|
@ -373,7 +368,6 @@ void LLDrawPoolAvatar::beginShadowPass(S32 pass)
|
|||
sVertexProgram = &gDeferredAttachmentShadowProgram;
|
||||
sDiffuseChannel = sVertexProgram->enableTexture(LLViewerShaderMgr::DIFFUSE_MAP);
|
||||
sVertexProgram->bind();
|
||||
LLVertexBuffer::sWeight4Loc = sVertexProgram->getAttribLocation(LLViewerShaderMgr::OBJECT_WEIGHT);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -392,7 +386,6 @@ void LLDrawPoolAvatar::endShadowPass(S32 pass)
|
|||
{
|
||||
LLVertexBuffer::unbind();
|
||||
sVertexProgram->unbind();
|
||||
LLVertexBuffer::sWeight4Loc = -1;
|
||||
sVertexProgram = NULL;
|
||||
}
|
||||
}
|
||||
|
|
@ -426,11 +419,6 @@ void LLDrawPoolAvatar::renderShadow(S32 pass)
|
|||
|
||||
if (pass == 0)
|
||||
{
|
||||
if (sShaderLevel > 0)
|
||||
{
|
||||
gAvatarMatrixParam = sVertexProgram->mUniform[LLViewerShaderMgr::AVATAR_MATRIX];
|
||||
}
|
||||
|
||||
avatarp->renderSkinned(AVATAR_RENDER_PASS_SINGLE);
|
||||
}
|
||||
else
|
||||
|
|
@ -587,11 +575,20 @@ void LLDrawPoolAvatar::beginImpostor()
|
|||
|
||||
gPipeline.enableLightsFullbright(LLColor4(1,1,1,1));
|
||||
sDiffuseChannel = 0;
|
||||
|
||||
if (LLGLSLShader::sNoFixedFunction)
|
||||
{
|
||||
gUIProgram.bind();
|
||||
}
|
||||
}
|
||||
|
||||
void LLDrawPoolAvatar::endImpostor()
|
||||
{
|
||||
gPipeline.enableLightsDynamic();
|
||||
if (LLGLSLShader::sNoFixedFunction)
|
||||
{
|
||||
gUIProgram.unbind();
|
||||
}
|
||||
}
|
||||
|
||||
void LLDrawPoolAvatar::beginRigid()
|
||||
|
|
@ -657,9 +654,10 @@ void LLDrawPoolAvatar::endDeferredImpostor()
|
|||
|
||||
void LLDrawPoolAvatar::beginDeferredRigid()
|
||||
{
|
||||
sVertexProgram = &gDeferredNonIndexedDiffuseProgram;
|
||||
sVertexProgram = &gDeferredNonIndexedDiffuseAlphaMaskNoColorProgram;
|
||||
|
||||
sVertexProgram->bind();
|
||||
sVertexProgram->setAlphaRange(0.2f, 1.f);
|
||||
}
|
||||
|
||||
void LLDrawPoolAvatar::endDeferredRigid()
|
||||
|
|
@ -773,7 +771,6 @@ void LLDrawPoolAvatar::beginRiggedSimple()
|
|||
{
|
||||
sDiffuseChannel = 0;
|
||||
sVertexProgram->bind();
|
||||
LLVertexBuffer::sWeight4Loc = sVertexProgram->getAttribLocation(LLViewerShaderMgr::OBJECT_WEIGHT);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -784,7 +781,6 @@ void LLDrawPoolAvatar::endRiggedSimple()
|
|||
{
|
||||
sVertexProgram->unbind();
|
||||
sVertexProgram = NULL;
|
||||
LLVertexBuffer::sWeight4Loc = -1;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -811,7 +807,34 @@ void LLDrawPoolAvatar::endRiggedFullbrightAlpha()
|
|||
|
||||
void LLDrawPoolAvatar::beginRiggedGlow()
|
||||
{
|
||||
beginRiggedFullbright();
|
||||
if (sShaderLevel > 0)
|
||||
{
|
||||
if (LLPipeline::sUnderWaterRender)
|
||||
{
|
||||
sVertexProgram = &gSkinnedObjectEmissiveWaterProgram;
|
||||
}
|
||||
else
|
||||
{
|
||||
sVertexProgram = &gSkinnedObjectEmissiveProgram;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (LLPipeline::sUnderWaterRender)
|
||||
{
|
||||
sVertexProgram = &gObjectEmissiveNonIndexedWaterProgram;
|
||||
}
|
||||
else
|
||||
{
|
||||
sVertexProgram = &gObjectEmissiveNonIndexedProgram;
|
||||
}
|
||||
}
|
||||
|
||||
if (sShaderLevel > 0 || gPipeline.canUseVertexShaders())
|
||||
{
|
||||
sDiffuseChannel = 0;
|
||||
sVertexProgram->bind();
|
||||
}
|
||||
}
|
||||
|
||||
void LLDrawPoolAvatar::endRiggedGlow()
|
||||
|
|
@ -848,7 +871,6 @@ void LLDrawPoolAvatar::beginRiggedFullbright()
|
|||
{
|
||||
sDiffuseChannel = 0;
|
||||
sVertexProgram->bind();
|
||||
LLVertexBuffer::sWeight4Loc = sVertexProgram->getAttribLocation(LLViewerShaderMgr::OBJECT_WEIGHT);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -859,7 +881,6 @@ void LLDrawPoolAvatar::endRiggedFullbright()
|
|||
{
|
||||
sVertexProgram->unbind();
|
||||
sVertexProgram = NULL;
|
||||
LLVertexBuffer::sWeight4Loc = -1;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -892,7 +913,6 @@ void LLDrawPoolAvatar::beginRiggedShinySimple()
|
|||
{
|
||||
sVertexProgram->bind();
|
||||
LLDrawPoolBump::bindCubeMap(sVertexProgram, 2, sDiffuseChannel, cube_channel, false);
|
||||
LLVertexBuffer::sWeight4Loc = sVertexProgram->getAttribLocation(LLViewerShaderMgr::OBJECT_WEIGHT);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -904,7 +924,6 @@ void LLDrawPoolAvatar::endRiggedShinySimple()
|
|||
LLDrawPoolBump::unbindCubeMap(sVertexProgram, 2, sDiffuseChannel, cube_channel, false);
|
||||
sVertexProgram->unbind();
|
||||
sVertexProgram = NULL;
|
||||
LLVertexBuffer::sWeight4Loc = -1;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -938,7 +957,6 @@ void LLDrawPoolAvatar::beginRiggedFullbrightShiny()
|
|||
{
|
||||
sVertexProgram->bind();
|
||||
LLDrawPoolBump::bindCubeMap(sVertexProgram, 2, sDiffuseChannel, cube_channel, false);
|
||||
LLVertexBuffer::sWeight4Loc = sVertexProgram->getAttribLocation(LLViewerShaderMgr::OBJECT_WEIGHT);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -950,7 +968,6 @@ void LLDrawPoolAvatar::endRiggedFullbrightShiny()
|
|||
LLDrawPoolBump::unbindCubeMap(sVertexProgram, 2, sDiffuseChannel, cube_channel, false);
|
||||
sVertexProgram->unbind();
|
||||
sVertexProgram = NULL;
|
||||
LLVertexBuffer::sWeight4Loc = -1;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -960,14 +977,12 @@ void LLDrawPoolAvatar::beginDeferredRiggedSimple()
|
|||
sVertexProgram = &gDeferredSkinnedDiffuseProgram;
|
||||
sDiffuseChannel = 0;
|
||||
sVertexProgram->bind();
|
||||
LLVertexBuffer::sWeight4Loc = sVertexProgram->getAttribLocation(LLViewerShaderMgr::OBJECT_WEIGHT);
|
||||
}
|
||||
|
||||
void LLDrawPoolAvatar::endDeferredRiggedSimple()
|
||||
{
|
||||
LLVertexBuffer::unbind();
|
||||
sVertexProgram->unbind();
|
||||
LLVertexBuffer::sWeight4Loc = -1;
|
||||
sVertexProgram = NULL;
|
||||
}
|
||||
|
||||
|
|
@ -977,7 +992,6 @@ void LLDrawPoolAvatar::beginDeferredRiggedBump()
|
|||
sVertexProgram->bind();
|
||||
normal_channel = sVertexProgram->enableTexture(LLViewerShaderMgr::BUMP_MAP);
|
||||
sDiffuseChannel = sVertexProgram->enableTexture(LLViewerShaderMgr::DIFFUSE_MAP);
|
||||
LLVertexBuffer::sWeight4Loc = sVertexProgram->getAttribLocation(LLViewerShaderMgr::OBJECT_WEIGHT);
|
||||
}
|
||||
|
||||
void LLDrawPoolAvatar::endDeferredRiggedBump()
|
||||
|
|
@ -986,7 +1000,6 @@ void LLDrawPoolAvatar::endDeferredRiggedBump()
|
|||
sVertexProgram->disableTexture(LLViewerShaderMgr::BUMP_MAP);
|
||||
sVertexProgram->disableTexture(LLViewerShaderMgr::DIFFUSE_MAP);
|
||||
sVertexProgram->unbind();
|
||||
LLVertexBuffer::sWeight4Loc = -1;
|
||||
normal_channel = -1;
|
||||
sDiffuseChannel = 0;
|
||||
sVertexProgram = NULL;
|
||||
|
|
@ -996,10 +1009,10 @@ void LLDrawPoolAvatar::beginDeferredSkinned()
|
|||
{
|
||||
sShaderLevel = mVertexShaderLevel;
|
||||
sVertexProgram = &gDeferredAvatarProgram;
|
||||
|
||||
sRenderingSkinned = TRUE;
|
||||
|
||||
sVertexProgram->bind();
|
||||
sVertexProgram->setAlphaRange(0.2f, 1.f);
|
||||
|
||||
sDiffuseChannel = sVertexProgram->enableTexture(LLViewerShaderMgr::DIFFUSE_MAP);
|
||||
gGL.getTexUnit(0)->activate();
|
||||
|
|
@ -1216,11 +1229,6 @@ void LLDrawPoolAvatar::renderAvatars(LLVOAvatar* single_avatar, S32 pass)
|
|||
return;
|
||||
}
|
||||
|
||||
if (sShaderLevel > 0)
|
||||
{
|
||||
gAvatarMatrixParam = sVertexProgram->mUniform[LLViewerShaderMgr::AVATAR_MATRIX];
|
||||
}
|
||||
|
||||
if ((sShaderLevel >= SHADER_LEVEL_CLOTH))
|
||||
{
|
||||
LLMatrix4 rot_mat;
|
||||
|
|
@ -1632,34 +1640,3 @@ LLVertexBufferAvatar::LLVertexBufferAvatar()
|
|||
}
|
||||
|
||||
|
||||
void LLVertexBufferAvatar::setupVertexBuffer(U32 data_mask) const
|
||||
{
|
||||
/*if (sRenderingSkinned)
|
||||
{
|
||||
U8* base = useVBOs() ? (U8*) mAlignedOffset : mMappedData;
|
||||
|
||||
glVertexPointer(3,GL_FLOAT, LLVertexBuffer::sTypeSize[LLVertexBuffer::TYPE_VERTEX], (void*)(base + 0));
|
||||
glNormalPointer(GL_FLOAT, LLVertexBuffer::sTypeSize[LLVertexBuffer::TYPE_NORMAL], (void*)(base + mOffsets[TYPE_NORMAL]));
|
||||
glTexCoordPointer(2,GL_FLOAT, LLVertexBuffer::sTypeSize[LLVertexBuffer::TYPE_TEXCOORD0], (void*)(base + mOffsets[TYPE_TEXCOORD0]));
|
||||
|
||||
set_vertex_weights(LLDrawPoolAvatar::sVertexProgram->mAttribute[LLViewerShaderMgr::AVATAR_WEIGHT],
|
||||
LLVertexBuffer::sTypeSize[LLVertexBuffer::TYPE_WEIGHT], (F32*)(base + mOffsets[TYPE_WEIGHT]));
|
||||
|
||||
if (sShaderLevel >= LLDrawPoolAvatar::SHADER_LEVEL_BUMP)
|
||||
{
|
||||
set_binormals(LLDrawPoolAvatar::sVertexProgram->mAttribute[LLViewerShaderMgr::BINORMAL],
|
||||
LLVertexBuffer::sTypeSize[LLVertexBuffer::TYPE_BINORMAL], (LLVector3*)(base + mOffsets[TYPE_BINORMAL]));
|
||||
}
|
||||
|
||||
if (sShaderLevel >= LLDrawPoolAvatar::SHADER_LEVEL_CLOTH)
|
||||
{
|
||||
set_vertex_clothing_weights(LLDrawPoolAvatar::sVertexProgram->mAttribute[LLViewerShaderMgr::AVATAR_CLOTHING],
|
||||
LLVertexBuffer::sTypeSize[LLVertexBuffer::TYPE_CLOTHWEIGHT], (LLVector4*)(base + mOffsets[TYPE_CLOTHWEIGHT]));
|
||||
}
|
||||
}
|
||||
else
|
||||
{*/
|
||||
LLVertexBuffer::setupVertexBuffer(data_mask);
|
||||
//}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -176,6 +176,7 @@ public:
|
|||
RIGGED_FULLBRIGHT_SHINY_MASK = RIGGED_SIMPLE_MASK,
|
||||
RIGGED_GLOW_MASK = LLVertexBuffer::MAP_VERTEX |
|
||||
LLVertexBuffer::MAP_TEXCOORD0 |
|
||||
LLVertexBuffer::MAP_EMISSIVE |
|
||||
LLVertexBuffer::MAP_WEIGHT4,
|
||||
RIGGED_ALPHA_MASK = RIGGED_SIMPLE_MASK,
|
||||
RIGGED_FULLBRIGHT_ALPHA_MASK = RIGGED_FULLBRIGHT_MASK,
|
||||
|
|
@ -214,7 +215,6 @@ class LLVertexBufferAvatar : public LLVertexBuffer
|
|||
{
|
||||
public:
|
||||
LLVertexBufferAvatar();
|
||||
virtual void setupVertexBuffer(U32 data_mask) const;
|
||||
};
|
||||
|
||||
extern S32 AVATAR_OFFSET_POS;
|
||||
|
|
|
|||
|
|
@ -46,7 +46,7 @@ static LLFastTimer::DeclareTimer FTM_RENDER_GRASS_DEFERRED("Deferred Grass");
|
|||
|
||||
void LLDrawPoolGlow::beginPostDeferredPass(S32 pass)
|
||||
{
|
||||
gDeferredFullbrightProgram.bind();
|
||||
gDeferredEmissiveProgram.bind();
|
||||
}
|
||||
|
||||
static LLFastTimer::DeclareTimer FTM_RENDER_GLOW_PUSH("Glow Push");
|
||||
|
|
@ -76,7 +76,7 @@ void LLDrawPoolGlow::renderPostDeferred(S32 pass)
|
|||
|
||||
void LLDrawPoolGlow::endPostDeferredPass(S32 pass)
|
||||
{
|
||||
gDeferredFullbrightProgram.unbind();
|
||||
gDeferredEmissiveProgram.unbind();
|
||||
LLRenderPass::endRenderPass(pass);
|
||||
}
|
||||
|
||||
|
|
@ -255,6 +255,7 @@ void LLDrawPoolGrass::prerender()
|
|||
void LLDrawPoolGrass::beginRenderPass(S32 pass)
|
||||
{
|
||||
LLFastTimer t(FTM_RENDER_GRASS);
|
||||
stop_glerror();
|
||||
|
||||
if (LLPipeline::sUnderWaterRender)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -142,7 +142,7 @@ void LLDrawPoolTree::beginDeferredPass(S32 pass)
|
|||
{
|
||||
LLFastTimer t(FTM_RENDER_TREES);
|
||||
|
||||
shader = &gDeferredNonIndexedDiffuseAlphaMaskProgram;
|
||||
shader = &gDeferredTreeProgram;
|
||||
shader->bind();
|
||||
shader->setAlphaRange(0.5f, 1.f);
|
||||
}
|
||||
|
|
@ -169,8 +169,8 @@ void LLDrawPoolTree::beginShadowPass(S32 pass)
|
|||
glPolygonOffset(gSavedSettings.getF32("RenderDeferredTreeShadowOffset"),
|
||||
gSavedSettings.getF32("RenderDeferredTreeShadowBias"));
|
||||
|
||||
gDeferredShadowAlphaMaskProgram.bind();
|
||||
gDeferredShadowAlphaMaskProgram.setAlphaRange(0.5f, 1.f);
|
||||
gDeferredTreeShadowProgram.bind();
|
||||
gDeferredTreeShadowProgram.setAlphaRange(0.5f, 1.f);
|
||||
}
|
||||
|
||||
void LLDrawPoolTree::renderShadow(S32 pass)
|
||||
|
|
@ -184,6 +184,7 @@ void LLDrawPoolTree::endShadowPass(S32 pass)
|
|||
|
||||
glPolygonOffset(gSavedSettings.getF32("RenderDeferredSpotShadowOffset"),
|
||||
gSavedSettings.getF32("RenderDeferredSpotShadowBias"));
|
||||
gDeferredTreeShadowProgram.unbind();
|
||||
}
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -3623,6 +3623,15 @@ void LLModelPreview::genLODs(S32 which_lod, U32 decimation, bool enforce_tri_lim
|
|||
|
||||
LLVertexBuffer::unbind();
|
||||
|
||||
bool no_ff = LLGLSLShader::sNoFixedFunction;
|
||||
LLGLSLShader* shader = LLGLSLShader::sCurBoundShaderPtr;
|
||||
LLGLSLShader::sNoFixedFunction = false;
|
||||
|
||||
if (shader)
|
||||
{
|
||||
shader->unbind();
|
||||
}
|
||||
|
||||
stop_gloderror();
|
||||
static U32 cur_name = 1;
|
||||
|
||||
|
|
@ -4003,6 +4012,13 @@ void LLModelPreview::genLODs(S32 which_lod, U32 decimation, bool enforce_tri_lim
|
|||
|
||||
mResourceCost = calcResourceCost();
|
||||
|
||||
LLVertexBuffer::unbind();
|
||||
LLGLSLShader::sNoFixedFunction = no_ff;
|
||||
if (shader)
|
||||
{
|
||||
shader->bind();
|
||||
}
|
||||
|
||||
/*if (which_lod == -1 && mScene[LLModel::LOD_PHYSICS].empty())
|
||||
{ //build physics scene
|
||||
mScene[LLModel::LOD_PHYSICS] = mScene[LLModel::LOD_LOW];
|
||||
|
|
@ -4950,7 +4966,7 @@ BOOL LLModelPreview::render()
|
|||
|
||||
llassert(binding == model->mMaterialList[i]);
|
||||
|
||||
gGL.diffuseColor4fv(instance.mMaterial[i].mDiffuseColor.mV);
|
||||
gGL.diffuseColor4fv(material.mDiffuseColor.mV);
|
||||
|
||||
if (material.mDiffuseMap.notNull())
|
||||
{
|
||||
|
|
@ -5261,7 +5277,7 @@ BOOL LLModelPreview::render()
|
|||
const LLImportMaterial& material = instance.mMaterial[binding];
|
||||
|
||||
buffer->setBuffer(type_mask & buffer->getTypeMask());
|
||||
gGL.diffuseColor4fv(instance.mMaterial[i].mDiffuseColor.mV);
|
||||
gGL.diffuseColor4fv(material.mDiffuseColor.mV);
|
||||
gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
|
||||
buffer->draw(LLRender::TRIANGLES, buffer->getNumIndices(), 0);
|
||||
gGL.diffuseColor3f(0.4f, 0.4f, 0.4f);
|
||||
|
|
|
|||
|
|
@ -295,12 +295,12 @@ void LLHUDEffectBeam::render()
|
|||
F32 alpha = mFadeInterp.getCurVal()*mColor.mV[3];
|
||||
alpha *= mInterpFade[i].getCurVal();
|
||||
coloru.mV[3] = (U8)alpha;
|
||||
glColor4ubv(coloru.mV);
|
||||
gGL.color4ubv(coloru.mV);
|
||||
|
||||
glPushMatrix();
|
||||
glTranslatef(pos_agent.mV[0], pos_agent.mV[1], pos_agent.mV[2]);
|
||||
glScalef(scale, scale, scale);
|
||||
gSphere.render(0);
|
||||
gSphere.render();
|
||||
glPopMatrix();
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1519,6 +1519,7 @@ void LLManipTranslate::renderSnapGuides()
|
|||
|
||||
F32 sz = mGridSizeMeters;
|
||||
F32 tiles = sz;
|
||||
|
||||
glMatrixMode(GL_TEXTURE);
|
||||
gGL.pushMatrix();
|
||||
usc = 1.0f/usc;
|
||||
|
|
@ -2243,7 +2244,7 @@ void LLManipTranslate::renderArrow(S32 which_arrow, S32 selected_arrow, F32 box_
|
|||
glRotatef(rot, axis.mV[0], axis.mV[1], axis.mV[2]);
|
||||
glScalef(mArrowScales.mV[index], mArrowScales.mV[index], mArrowScales.mV[index] * 1.5f);
|
||||
|
||||
gCone.render(CONE_LOD_HIGHEST);
|
||||
gCone.render();
|
||||
|
||||
gGL.popMatrix();
|
||||
}
|
||||
|
|
|
|||
|
|
@ -89,6 +89,7 @@
|
|||
#include "llvoavatarself.h"
|
||||
#include "llvovolume.h"
|
||||
#include "pipeline.h"
|
||||
#include "llviewershadermgr.h"
|
||||
|
||||
#include "llglheaders.h"
|
||||
|
||||
|
|
@ -5570,8 +5571,7 @@ void pushWireframe(LLDrawable* drawable)
|
|||
for (S32 i = 0; i < rigged_volume->getNumVolumeFaces(); ++i)
|
||||
{
|
||||
const LLVolumeFace& face = rigged_volume->getVolumeFace(i);
|
||||
glVertexPointer(3, GL_FLOAT, 16, face.mPositions);
|
||||
glDrawElements(GL_TRIANGLES, face.mNumIndices, GL_UNSIGNED_SHORT, face.mIndices);
|
||||
LLVertexBuffer::drawElements(LLRender::TRIANGLES, face.mPositions, face.mTexCoords, face.mNumIndices, face.mIndices);
|
||||
}
|
||||
gGL.popMatrix();
|
||||
}
|
||||
|
|
@ -5584,7 +5584,7 @@ void pushWireframe(LLDrawable* drawable)
|
|||
LLFace* face = drawable->getFace(i);
|
||||
if (face->verify())
|
||||
{
|
||||
pushVerts(face, LLVertexBuffer::MAP_VERTEX);
|
||||
pushVerts(face, LLVertexBuffer::MAP_VERTEX | LLVertexBuffer::MAP_TEXCOORD0);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -5604,6 +5604,13 @@ void LLSelectNode::renderOneWireframe(const LLColor4& color)
|
|||
return;
|
||||
}
|
||||
|
||||
LLGLSLShader* shader = LLGLSLShader::sCurBoundShaderPtr;
|
||||
|
||||
if (shader)
|
||||
{
|
||||
gHighlightProgram.bind();
|
||||
}
|
||||
|
||||
glMatrixMode(GL_MODELVIEW);
|
||||
gGL.pushMatrix();
|
||||
|
||||
|
|
@ -5627,26 +5634,41 @@ void LLSelectNode::renderOneWireframe(const LLColor4& color)
|
|||
if (LLSelectMgr::sRenderHiddenSelections) // && gFloaterTools && gFloaterTools->getVisible())
|
||||
{
|
||||
gGL.blendFunc(LLRender::BF_SOURCE_COLOR, LLRender::BF_ONE);
|
||||
LLGLEnable fog(GL_FOG);
|
||||
glFogi(GL_FOG_MODE, GL_LINEAR);
|
||||
float d = (LLViewerCamera::getInstance()->getPointOfInterest()-LLViewerCamera::getInstance()->getOrigin()).magVec();
|
||||
LLColor4 fogCol = color * (F32)llclamp((LLSelectMgr::getInstance()->getSelectionCenterGlobal()-gAgentCamera.getCameraPositionGlobal()).magVec()/(LLSelectMgr::getInstance()->getBBoxOfSelection().getExtentLocal().magVec()*4), 0.0, 1.0);
|
||||
glFogf(GL_FOG_START, d);
|
||||
glFogf(GL_FOG_END, d*(1 + (LLViewerCamera::getInstance()->getView() / LLViewerCamera::getInstance()->getDefaultFOV())));
|
||||
glFogfv(GL_FOG_COLOR, fogCol.mV);
|
||||
|
||||
LLGLDepthTest gls_depth(GL_TRUE, GL_FALSE, GL_GEQUAL);
|
||||
gGL.setAlphaRejectSettings(LLRender::CF_DEFAULT);
|
||||
if (shader)
|
||||
{
|
||||
gGL.diffuseColor4f(color.mV[VRED], color.mV[VGREEN], color.mV[VBLUE], 0.4f);
|
||||
gHighlightProgram.uniform4f("highlight_color", color.mV[VRED], color.mV[VGREEN], color.mV[VBLUE], 0.4f);
|
||||
pushWireframe(drawable);
|
||||
}
|
||||
else
|
||||
{
|
||||
LLGLEnable fog(GL_FOG);
|
||||
glFogi(GL_FOG_MODE, GL_LINEAR);
|
||||
float d = (LLViewerCamera::getInstance()->getPointOfInterest()-LLViewerCamera::getInstance()->getOrigin()).magVec();
|
||||
LLColor4 fogCol = color * (F32)llclamp((LLSelectMgr::getInstance()->getSelectionCenterGlobal()-gAgentCamera.getCameraPositionGlobal()).magVec()/(LLSelectMgr::getInstance()->getBBoxOfSelection().getExtentLocal().magVec()*4), 0.0, 1.0);
|
||||
glFogf(GL_FOG_START, d);
|
||||
glFogf(GL_FOG_END, d*(1 + (LLViewerCamera::getInstance()->getView() / LLViewerCamera::getInstance()->getDefaultFOV())));
|
||||
glFogfv(GL_FOG_COLOR, fogCol.mV);
|
||||
|
||||
gGL.setAlphaRejectSettings(LLRender::CF_DEFAULT);
|
||||
{
|
||||
gGL.diffuseColor4f(color.mV[VRED], color.mV[VGREEN], color.mV[VBLUE], 0.4f);
|
||||
pushWireframe(drawable);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
gGL.flush();
|
||||
gGL.setSceneBlendType(LLRender::BT_ALPHA);
|
||||
|
||||
gGL.diffuseColor4f(color.mV[VRED]*2, color.mV[VGREEN]*2, color.mV[VBLUE]*2, LLSelectMgr::sHighlightAlpha*2);
|
||||
if (shader)
|
||||
{
|
||||
gHighlightProgram.uniform4f("highlight_color", color.mV[VRED]*2, color.mV[VGREEN]*2, color.mV[VBLUE]*2, LLSelectMgr::sHighlightAlpha*2);
|
||||
}
|
||||
else
|
||||
{
|
||||
gGL.diffuseColor4f(color.mV[VRED]*2, color.mV[VGREEN]*2, color.mV[VBLUE]*2, LLSelectMgr::sHighlightAlpha*2);
|
||||
}
|
||||
LLGLEnable offset(GL_POLYGON_OFFSET_LINE);
|
||||
glPolygonOffset(3.f, 3.f);
|
||||
glLineWidth(3.f);
|
||||
|
|
@ -5654,6 +5676,11 @@ void LLSelectNode::renderOneWireframe(const LLColor4& color)
|
|||
glLineWidth(1.f);
|
||||
glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
|
||||
gGL.popMatrix();
|
||||
|
||||
if (shader)
|
||||
{
|
||||
shader->bind();
|
||||
}
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
|
|
|
|||
|
|
@ -4248,7 +4248,7 @@ public:
|
|||
LLVector3 local_start = mStart;
|
||||
LLVector3 local_end = mEnd;
|
||||
|
||||
if (!gPipeline.hasRenderType(drawable->getRenderType()) || !drawable->isVisible())
|
||||
if (!drawable || !gPipeline.hasRenderType(drawable->getRenderType()) || !drawable->isVisible())
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -506,7 +506,8 @@ void LLTracker::renderBeacon(LLVector3d pos_global,
|
|||
|
||||
|
||||
glMatrixMode(GL_MODELVIEW);
|
||||
glPushMatrix();
|
||||
gGL.pushMatrix();
|
||||
{
|
||||
glTranslatef(pos_agent.mV[0], pos_agent.mV[1], pos_agent.mV[2]);
|
||||
|
||||
draw_shockwave(1024.f, gRenderStartTime.getElapsedTimeF32(), 32, fogged_color);
|
||||
|
|
@ -559,9 +560,8 @@ void LLTracker::renderBeacon(LLVector3d pos_global,
|
|||
|
||||
gGL.end();
|
||||
}
|
||||
|
||||
//gCylinder.render(1000);
|
||||
glPopMatrix();
|
||||
}
|
||||
gGL.popMatrix();
|
||||
|
||||
std::string text;
|
||||
text = llformat( "%.0f m", to_vec.magVec());
|
||||
|
|
|
|||
|
|
@ -459,7 +459,10 @@ void LLViewerJointMesh::uploadJointMatrices()
|
|||
}
|
||||
}
|
||||
stop_glerror();
|
||||
glUniform4fvARB(gAvatarMatrixParam, 45, mat);
|
||||
if (LLGLSLShader::sCurBoundShaderPtr)
|
||||
{
|
||||
LLGLSLShader::sCurBoundShaderPtr->uniform4fv(LLViewerShaderMgr::AVATAR_MATRIX, 45, mat);
|
||||
}
|
||||
stop_glerror();
|
||||
}
|
||||
else
|
||||
|
|
@ -512,7 +515,8 @@ U32 LLViewerJointMesh::drawShape( F32 pixelArea, BOOL first_pass, BOOL is_dummy)
|
|||
{
|
||||
if (!mValid || !mMesh || !mFace || !mVisible ||
|
||||
!mFace->getVertexBuffer() ||
|
||||
mMesh->getNumFaces() == 0)
|
||||
mMesh->getNumFaces() == 0 ||
|
||||
(LLGLSLShader::sNoFixedFunction && LLGLSLShader::sCurBoundShaderPtr == NULL))
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -97,6 +97,8 @@ LLGLSLShader gObjectAlphaMaskNoColorProgram;
|
|||
LLGLSLShader gObjectAlphaMaskNoColorWaterProgram;
|
||||
LLGLSLShader gObjectFullbrightNonIndexedProgram;
|
||||
LLGLSLShader gObjectFullbrightNonIndexedWaterProgram;
|
||||
LLGLSLShader gObjectEmissiveNonIndexedProgram;
|
||||
LLGLSLShader gObjectEmissiveNonIndexedWaterProgram;
|
||||
LLGLSLShader gObjectFullbrightShinyNonIndexedProgram;
|
||||
LLGLSLShader gObjectFullbrightShinyNonIndexedWaterProgram;
|
||||
LLGLSLShader gObjectShinyNonIndexedProgram;
|
||||
|
|
@ -105,11 +107,13 @@ LLGLSLShader gObjectShinyNonIndexedWaterProgram;
|
|||
//object hardware skinning shaders
|
||||
LLGLSLShader gSkinnedObjectSimpleProgram;
|
||||
LLGLSLShader gSkinnedObjectFullbrightProgram;
|
||||
LLGLSLShader gSkinnedObjectEmissiveProgram;
|
||||
LLGLSLShader gSkinnedObjectFullbrightShinyProgram;
|
||||
LLGLSLShader gSkinnedObjectShinySimpleProgram;
|
||||
|
||||
LLGLSLShader gSkinnedObjectSimpleWaterProgram;
|
||||
LLGLSLShader gSkinnedObjectFullbrightWaterProgram;
|
||||
LLGLSLShader gSkinnedObjectEmissiveWaterProgram;
|
||||
LLGLSLShader gSkinnedObjectFullbrightShinyWaterProgram;
|
||||
LLGLSLShader gSkinnedObjectShinySimpleWaterProgram;
|
||||
|
||||
|
|
@ -147,12 +151,14 @@ LLGLSLShader gDeferredDiffuseProgram;
|
|||
LLGLSLShader gDeferredDiffuseAlphaMaskProgram;
|
||||
LLGLSLShader gDeferredNonIndexedDiffuseProgram;
|
||||
LLGLSLShader gDeferredNonIndexedDiffuseAlphaMaskProgram;
|
||||
LLGLSLShader gDeferredNonIndexedDiffuseAlphaMaskNoColorProgram;
|
||||
LLGLSLShader gDeferredSkinnedDiffuseProgram;
|
||||
LLGLSLShader gDeferredSkinnedBumpProgram;
|
||||
LLGLSLShader gDeferredSkinnedAlphaProgram;
|
||||
LLGLSLShader gDeferredBumpProgram;
|
||||
LLGLSLShader gDeferredTerrainProgram;
|
||||
LLGLSLShader gDeferredTreeProgram;
|
||||
LLGLSLShader gDeferredTreeShadowProgram;
|
||||
LLGLSLShader gDeferredAvatarProgram;
|
||||
LLGLSLShader gDeferredAvatarAlphaProgram;
|
||||
LLGLSLShader gDeferredLightProgram;
|
||||
|
|
@ -169,6 +175,7 @@ LLGLSLShader gDeferredAttachmentShadowProgram;
|
|||
LLGLSLShader gDeferredAlphaProgram;
|
||||
LLGLSLShader gDeferredAvatarEyesProgram;
|
||||
LLGLSLShader gDeferredFullbrightProgram;
|
||||
LLGLSLShader gDeferredEmissiveProgram;
|
||||
LLGLSLShader gDeferredGIProgram;
|
||||
LLGLSLShader gDeferredGIFinalProgram;
|
||||
LLGLSLShader gDeferredPostGIProgram;
|
||||
|
|
@ -179,10 +186,6 @@ LLGLSLShader gDeferredWLCloudProgram;
|
|||
LLGLSLShader gDeferredStarProgram;
|
||||
LLGLSLShader gLuminanceGatherProgram;
|
||||
|
||||
|
||||
//current avatar shader parameter pointer
|
||||
GLint gAvatarMatrixParam;
|
||||
|
||||
LLViewerShaderMgr::LLViewerShaderMgr() :
|
||||
mVertexShaderLevel(SHADER_COUNT, 0),
|
||||
mMaxAvatarShaderLevel(0)
|
||||
|
|
@ -223,14 +226,18 @@ LLViewerShaderMgr::LLViewerShaderMgr() :
|
|||
mShaderList.push_back(&gTreeWaterProgram);
|
||||
mShaderList.push_back(&gObjectFullbrightNonIndexedProgram);
|
||||
mShaderList.push_back(&gObjectFullbrightNonIndexedWaterProgram);
|
||||
mShaderList.push_back(&gObjectEmissiveNonIndexedProgram);
|
||||
mShaderList.push_back(&gObjectEmissiveNonIndexedWaterProgram);
|
||||
mShaderList.push_back(&gObjectFullbrightShinyNonIndexedProgram);
|
||||
mShaderList.push_back(&gObjectFullbrightShinyNonIndexedWaterProgram);
|
||||
mShaderList.push_back(&gSkinnedObjectSimpleProgram);
|
||||
mShaderList.push_back(&gSkinnedObjectFullbrightProgram);
|
||||
mShaderList.push_back(&gSkinnedObjectEmissiveProgram);
|
||||
mShaderList.push_back(&gSkinnedObjectFullbrightShinyProgram);
|
||||
mShaderList.push_back(&gSkinnedObjectShinySimpleProgram);
|
||||
mShaderList.push_back(&gSkinnedObjectSimpleWaterProgram);
|
||||
mShaderList.push_back(&gSkinnedObjectFullbrightWaterProgram);
|
||||
mShaderList.push_back(&gSkinnedObjectEmissiveWaterProgram);
|
||||
mShaderList.push_back(&gSkinnedObjectFullbrightShinyWaterProgram);
|
||||
mShaderList.push_back(&gSkinnedObjectShinySimpleWaterProgram);
|
||||
mShaderList.push_back(&gTerrainProgram);
|
||||
|
|
@ -251,6 +258,7 @@ LLViewerShaderMgr::LLViewerShaderMgr() :
|
|||
mShaderList.push_back(&gDeferredAlphaProgram);
|
||||
mShaderList.push_back(&gDeferredSkinnedAlphaProgram);
|
||||
mShaderList.push_back(&gDeferredFullbrightProgram);
|
||||
mShaderList.push_back(&gDeferredEmissiveProgram);
|
||||
mShaderList.push_back(&gDeferredAvatarEyesProgram);
|
||||
mShaderList.push_back(&gDeferredPostGIProgram);
|
||||
mShaderList.push_back(&gDeferredEdgeProgram);
|
||||
|
|
@ -690,6 +698,8 @@ void LLViewerShaderMgr::unloadShaders()
|
|||
gObjectAlphaMaskNoColorWaterProgram.unload();
|
||||
gObjectFullbrightNonIndexedProgram.unload();
|
||||
gObjectFullbrightNonIndexedWaterProgram.unload();
|
||||
gObjectEmissiveNonIndexedProgram.unload();
|
||||
gObjectEmissiveNonIndexedWaterProgram.unload();
|
||||
gTreeProgram.unload();
|
||||
gTreeWaterProgram.unload();
|
||||
|
||||
|
|
@ -700,11 +710,13 @@ void LLViewerShaderMgr::unloadShaders()
|
|||
|
||||
gSkinnedObjectSimpleProgram.unload();
|
||||
gSkinnedObjectFullbrightProgram.unload();
|
||||
gSkinnedObjectEmissiveProgram.unload();
|
||||
gSkinnedObjectFullbrightShinyProgram.unload();
|
||||
gSkinnedObjectShinySimpleProgram.unload();
|
||||
|
||||
gSkinnedObjectSimpleWaterProgram.unload();
|
||||
gSkinnedObjectFullbrightWaterProgram.unload();
|
||||
gSkinnedObjectEmissiveWaterProgram.unload();
|
||||
gSkinnedObjectFullbrightShinyWaterProgram.unload();
|
||||
gSkinnedObjectShinySimpleWaterProgram.unload();
|
||||
|
||||
|
|
@ -730,6 +742,7 @@ void LLViewerShaderMgr::unloadShaders()
|
|||
gDeferredDiffuseProgram.unload();
|
||||
gDeferredDiffuseAlphaMaskProgram.unload();
|
||||
gDeferredNonIndexedDiffuseAlphaMaskProgram.unload();
|
||||
gDeferredNonIndexedDiffuseAlphaMaskNoColorProgram.unload();
|
||||
gDeferredNonIndexedDiffuseProgram.unload();
|
||||
gDeferredSkinnedDiffuseProgram.unload();
|
||||
gDeferredSkinnedBumpProgram.unload();
|
||||
|
|
@ -1086,9 +1099,11 @@ BOOL LLViewerShaderMgr::loadShadersDeferred()
|
|||
if (mVertexShaderLevel[SHADER_DEFERRED] == 0)
|
||||
{
|
||||
gDeferredTreeProgram.unload();
|
||||
gDeferredTreeShadowProgram.unload();
|
||||
gDeferredDiffuseProgram.unload();
|
||||
gDeferredDiffuseAlphaMaskProgram.unload();
|
||||
gDeferredNonIndexedDiffuseAlphaMaskProgram.unload();
|
||||
gDeferredNonIndexedDiffuseAlphaMaskNoColorProgram.unload();
|
||||
gDeferredNonIndexedDiffuseProgram.unload();
|
||||
gDeferredSkinnedDiffuseProgram.unload();
|
||||
gDeferredSkinnedBumpProgram.unload();
|
||||
|
|
@ -1111,6 +1126,7 @@ BOOL LLViewerShaderMgr::loadShadersDeferred()
|
|||
gDeferredAvatarAlphaProgram.unload();
|
||||
gDeferredAlphaProgram.unload();
|
||||
gDeferredFullbrightProgram.unload();
|
||||
gDeferredEmissiveProgram.unload();
|
||||
gDeferredAvatarEyesProgram.unload();
|
||||
gDeferredPostGIProgram.unload();
|
||||
gDeferredEdgeProgram.unload();
|
||||
|
|
@ -1163,6 +1179,16 @@ BOOL LLViewerShaderMgr::loadShadersDeferred()
|
|||
gDeferredNonIndexedDiffuseAlphaMaskProgram.mShaderLevel = mVertexShaderLevel[SHADER_DEFERRED];
|
||||
success = gDeferredNonIndexedDiffuseAlphaMaskProgram.createShader(NULL, NULL);
|
||||
}
|
||||
|
||||
if (success)
|
||||
{
|
||||
gDeferredNonIndexedDiffuseAlphaMaskNoColorProgram.mName = "Deferred Diffuse Non-Indexed Alpha Mask Shader";
|
||||
gDeferredNonIndexedDiffuseAlphaMaskNoColorProgram.mShaderFiles.clear();
|
||||
gDeferredNonIndexedDiffuseAlphaMaskNoColorProgram.mShaderFiles.push_back(make_pair("deferred/diffuseNoColorV.glsl", GL_VERTEX_SHADER_ARB));
|
||||
gDeferredNonIndexedDiffuseAlphaMaskNoColorProgram.mShaderFiles.push_back(make_pair("deferred/diffuseAlphaMaskNoColorF.glsl", GL_FRAGMENT_SHADER_ARB));
|
||||
gDeferredNonIndexedDiffuseAlphaMaskNoColorProgram.mShaderLevel = mVertexShaderLevel[SHADER_DEFERRED];
|
||||
success = gDeferredNonIndexedDiffuseAlphaMaskNoColorProgram.createShader(NULL, NULL);
|
||||
}
|
||||
|
||||
if (success)
|
||||
{
|
||||
|
|
@ -1234,6 +1260,16 @@ BOOL LLViewerShaderMgr::loadShadersDeferred()
|
|||
success = gDeferredTreeProgram.createShader(NULL, NULL);
|
||||
}
|
||||
|
||||
if (success)
|
||||
{
|
||||
gDeferredTreeShadowProgram.mName = "Deferred Tree Shadow Shader";
|
||||
gDeferredTreeShadowProgram.mShaderFiles.clear();
|
||||
gDeferredTreeShadowProgram.mShaderFiles.push_back(make_pair("deferred/treeShadowV.glsl", GL_VERTEX_SHADER_ARB));
|
||||
gDeferredTreeShadowProgram.mShaderFiles.push_back(make_pair("deferred/treeShadowF.glsl", GL_FRAGMENT_SHADER_ARB));
|
||||
gDeferredTreeShadowProgram.mShaderLevel = mVertexShaderLevel[SHADER_DEFERRED];
|
||||
success = gDeferredTreeShadowProgram.createShader(NULL, NULL);
|
||||
}
|
||||
|
||||
if (success)
|
||||
{
|
||||
gDeferredImpostorProgram.mName = "Deferred Impostor Shader";
|
||||
|
|
@ -1436,6 +1472,20 @@ BOOL LLViewerShaderMgr::loadShadersDeferred()
|
|||
success = gDeferredFullbrightProgram.createShader(NULL, NULL);
|
||||
}
|
||||
|
||||
if (success)
|
||||
{
|
||||
gDeferredEmissiveProgram.mName = "Deferred Emissive Shader";
|
||||
gDeferredEmissiveProgram.mFeatures.calculatesAtmospherics = true;
|
||||
gDeferredEmissiveProgram.mFeatures.hasGamma = true;
|
||||
gDeferredEmissiveProgram.mFeatures.hasTransport = true;
|
||||
gDeferredEmissiveProgram.mFeatures.mIndexedTextureChannels = gGLManager.mNumTextureImageUnits;
|
||||
gDeferredEmissiveProgram.mShaderFiles.clear();
|
||||
gDeferredEmissiveProgram.mShaderFiles.push_back(make_pair("deferred/emissiveV.glsl", GL_VERTEX_SHADER_ARB));
|
||||
gDeferredEmissiveProgram.mShaderFiles.push_back(make_pair("deferred/emissiveF.glsl", GL_FRAGMENT_SHADER_ARB));
|
||||
gDeferredEmissiveProgram.mShaderLevel = mVertexShaderLevel[SHADER_DEFERRED];
|
||||
success = gDeferredEmissiveProgram.createShader(NULL, NULL);
|
||||
}
|
||||
|
||||
if (success)
|
||||
{
|
||||
// load water shader
|
||||
|
|
@ -1553,7 +1603,7 @@ BOOL LLViewerShaderMgr::loadShadersDeferred()
|
|||
gDeferredAvatarAlphaProgram.mFeatures.disableTextureIndex = true;
|
||||
gDeferredAvatarAlphaProgram.mShaderFiles.clear();
|
||||
gDeferredAvatarAlphaProgram.mShaderFiles.push_back(make_pair("deferred/avatarAlphaV.glsl", GL_VERTEX_SHADER_ARB));
|
||||
gDeferredAvatarAlphaProgram.mShaderFiles.push_back(make_pair("deferred/alphaNonIndexedF.glsl", GL_FRAGMENT_SHADER_ARB));
|
||||
gDeferredAvatarAlphaProgram.mShaderFiles.push_back(make_pair("deferred/alphaNonIndexedNoColorF.glsl", GL_FRAGMENT_SHADER_ARB));
|
||||
gDeferredAvatarAlphaProgram.mShaderLevel = mVertexShaderLevel[SHADER_DEFERRED];
|
||||
success = gDeferredAvatarAlphaProgram.createShader(NULL, &mAvatarUniforms);
|
||||
}
|
||||
|
|
@ -1736,12 +1786,16 @@ BOOL LLViewerShaderMgr::loadShadersObject()
|
|||
gObjectAlphaMaskNoColorWaterProgram.unload();
|
||||
gObjectFullbrightNonIndexedProgram.unload();
|
||||
gObjectFullbrightNonIndexedWaterProgram.unload();
|
||||
gObjectEmissiveNonIndexedProgram.unload();
|
||||
gObjectEmissiveNonIndexedWaterProgram.unload();
|
||||
gSkinnedObjectSimpleProgram.unload();
|
||||
gSkinnedObjectFullbrightProgram.unload();
|
||||
gSkinnedObjectEmissiveProgram.unload();
|
||||
gSkinnedObjectFullbrightShinyProgram.unload();
|
||||
gSkinnedObjectShinySimpleProgram.unload();
|
||||
gSkinnedObjectSimpleWaterProgram.unload();
|
||||
gSkinnedObjectFullbrightWaterProgram.unload();
|
||||
gSkinnedObjectEmissiveWaterProgram.unload();
|
||||
gSkinnedObjectFullbrightShinyWaterProgram.unload();
|
||||
gSkinnedObjectShinySimpleWaterProgram.unload();
|
||||
gTreeProgram.unload();
|
||||
|
|
@ -1919,6 +1973,37 @@ BOOL LLViewerShaderMgr::loadShadersObject()
|
|||
success = gObjectFullbrightNonIndexedWaterProgram.createShader(NULL, NULL);
|
||||
}
|
||||
|
||||
if (success)
|
||||
{
|
||||
gObjectEmissiveNonIndexedProgram.mName = "Non Indexed Emissive Shader";
|
||||
gObjectEmissiveNonIndexedProgram.mFeatures.calculatesAtmospherics = true;
|
||||
gObjectEmissiveNonIndexedProgram.mFeatures.hasGamma = true;
|
||||
gObjectEmissiveNonIndexedProgram.mFeatures.hasTransport = true;
|
||||
gObjectEmissiveNonIndexedProgram.mFeatures.isFullbright = true;
|
||||
gObjectEmissiveNonIndexedProgram.mFeatures.disableTextureIndex = true;
|
||||
gObjectEmissiveNonIndexedProgram.mShaderFiles.clear();
|
||||
gObjectEmissiveNonIndexedProgram.mShaderFiles.push_back(make_pair("objects/emissiveV.glsl", GL_VERTEX_SHADER_ARB));
|
||||
gObjectEmissiveNonIndexedProgram.mShaderFiles.push_back(make_pair("objects/fullbrightF.glsl", GL_FRAGMENT_SHADER_ARB));
|
||||
gObjectEmissiveNonIndexedProgram.mShaderLevel = mVertexShaderLevel[SHADER_OBJECT];
|
||||
success = gObjectEmissiveNonIndexedProgram.createShader(NULL, NULL);
|
||||
}
|
||||
|
||||
if (success)
|
||||
{
|
||||
gObjectEmissiveNonIndexedWaterProgram.mName = "Non Indexed Emissive Water Shader";
|
||||
gObjectEmissiveNonIndexedWaterProgram.mFeatures.calculatesAtmospherics = true;
|
||||
gObjectEmissiveNonIndexedWaterProgram.mFeatures.isFullbright = true;
|
||||
gObjectEmissiveNonIndexedWaterProgram.mFeatures.hasWaterFog = true;
|
||||
gObjectEmissiveNonIndexedWaterProgram.mFeatures.hasTransport = true;
|
||||
gObjectEmissiveNonIndexedWaterProgram.mFeatures.disableTextureIndex = true;
|
||||
gObjectEmissiveNonIndexedWaterProgram.mShaderFiles.clear();
|
||||
gObjectEmissiveNonIndexedWaterProgram.mShaderFiles.push_back(make_pair("objects/emissiveV.glsl", GL_VERTEX_SHADER_ARB));
|
||||
gObjectEmissiveNonIndexedWaterProgram.mShaderFiles.push_back(make_pair("objects/fullbrightWaterF.glsl", GL_FRAGMENT_SHADER_ARB));
|
||||
gObjectEmissiveNonIndexedWaterProgram.mShaderLevel = mVertexShaderLevel[SHADER_OBJECT];
|
||||
gObjectEmissiveNonIndexedWaterProgram.mShaderGroup = LLGLSLShader::SG_WATER;
|
||||
success = gObjectEmissiveNonIndexedWaterProgram.createShader(NULL, NULL);
|
||||
}
|
||||
|
||||
if (success)
|
||||
{
|
||||
gObjectFullbrightNoColorProgram.mName = "Non Indexed no color Fullbright Shader";
|
||||
|
|
@ -2299,6 +2384,39 @@ BOOL LLViewerShaderMgr::loadShadersObject()
|
|||
success = gSkinnedObjectFullbrightProgram.createShader(NULL, NULL);
|
||||
}
|
||||
|
||||
if (success)
|
||||
{
|
||||
gSkinnedObjectEmissiveProgram.mName = "Skinned Emissive Shader";
|
||||
gSkinnedObjectEmissiveProgram.mFeatures.calculatesAtmospherics = true;
|
||||
gSkinnedObjectEmissiveProgram.mFeatures.hasGamma = true;
|
||||
gSkinnedObjectEmissiveProgram.mFeatures.hasTransport = true;
|
||||
gSkinnedObjectEmissiveProgram.mFeatures.isFullbright = true;
|
||||
gSkinnedObjectEmissiveProgram.mFeatures.hasObjectSkinning = true;
|
||||
gSkinnedObjectEmissiveProgram.mFeatures.disableTextureIndex = true;
|
||||
gSkinnedObjectEmissiveProgram.mShaderFiles.clear();
|
||||
gSkinnedObjectEmissiveProgram.mShaderFiles.push_back(make_pair("objects/emissiveSkinnedV.glsl", GL_VERTEX_SHADER_ARB));
|
||||
gSkinnedObjectEmissiveProgram.mShaderFiles.push_back(make_pair("objects/fullbrightF.glsl", GL_FRAGMENT_SHADER_ARB));
|
||||
gSkinnedObjectEmissiveProgram.mShaderLevel = mVertexShaderLevel[SHADER_OBJECT];
|
||||
success = gSkinnedObjectEmissiveProgram.createShader(NULL, NULL);
|
||||
}
|
||||
|
||||
if (success)
|
||||
{
|
||||
gSkinnedObjectEmissiveWaterProgram.mName = "Skinned Emissive Water Shader";
|
||||
gSkinnedObjectEmissiveWaterProgram.mFeatures.calculatesAtmospherics = true;
|
||||
gSkinnedObjectEmissiveWaterProgram.mFeatures.hasGamma = true;
|
||||
gSkinnedObjectEmissiveWaterProgram.mFeatures.hasTransport = true;
|
||||
gSkinnedObjectEmissiveWaterProgram.mFeatures.isFullbright = true;
|
||||
gSkinnedObjectEmissiveWaterProgram.mFeatures.hasObjectSkinning = true;
|
||||
gSkinnedObjectEmissiveWaterProgram.mFeatures.disableTextureIndex = true;
|
||||
gSkinnedObjectEmissiveWaterProgram.mFeatures.hasWaterFog = true;
|
||||
gSkinnedObjectEmissiveWaterProgram.mShaderFiles.clear();
|
||||
gSkinnedObjectEmissiveWaterProgram.mShaderFiles.push_back(make_pair("objects/emissiveSkinnedV.glsl", GL_VERTEX_SHADER_ARB));
|
||||
gSkinnedObjectEmissiveWaterProgram.mShaderFiles.push_back(make_pair("objects/fullbrightWaterF.glsl", GL_FRAGMENT_SHADER_ARB));
|
||||
gSkinnedObjectEmissiveWaterProgram.mShaderLevel = mVertexShaderLevel[SHADER_OBJECT];
|
||||
success = gSkinnedObjectEmissiveWaterProgram.createShader(NULL, NULL);
|
||||
}
|
||||
|
||||
if (success)
|
||||
{
|
||||
gSkinnedObjectFullbrightShinyProgram.mName = "Skinned Fullbright Shiny Shader";
|
||||
|
|
|
|||
|
|
@ -71,15 +71,6 @@ public:
|
|||
SHADER_COUNT
|
||||
};
|
||||
|
||||
typedef enum
|
||||
{
|
||||
MATERIAL_COLOR = 0,
|
||||
SPECULAR_COLOR,
|
||||
BINORMAL,
|
||||
OBJECT_WEIGHT,
|
||||
END_RESERVED_ATTRIBS
|
||||
} eGLSLReservedAttribs;
|
||||
|
||||
typedef enum
|
||||
{
|
||||
DIFFUSE_MAP = 0,
|
||||
|
|
@ -309,6 +300,8 @@ extern LLGLSLShader gObjectFullbrightAlphaMaskProgram;
|
|||
extern LLGLSLShader gObjectFullbrightWaterAlphaMaskProgram;
|
||||
extern LLGLSLShader gObjectFullbrightNonIndexedProgram;
|
||||
extern LLGLSLShader gObjectFullbrightNonIndexedWaterProgram;
|
||||
extern LLGLSLShader gObjectEmissiveNonIndexedProgram;
|
||||
extern LLGLSLShader gObjectEmissiveNonIndexedWaterProgram;
|
||||
extern LLGLSLShader gObjectBumpProgram;
|
||||
extern LLGLSLShader gTreeProgram;
|
||||
extern LLGLSLShader gTreeWaterProgram;
|
||||
|
|
@ -328,11 +321,13 @@ extern LLGLSLShader gObjectShinyNonIndexedWaterProgram;
|
|||
|
||||
extern LLGLSLShader gSkinnedObjectSimpleProgram;
|
||||
extern LLGLSLShader gSkinnedObjectFullbrightProgram;
|
||||
extern LLGLSLShader gSkinnedObjectEmissiveProgram;
|
||||
extern LLGLSLShader gSkinnedObjectFullbrightShinyProgram;
|
||||
extern LLGLSLShader gSkinnedObjectShinySimpleProgram;
|
||||
|
||||
extern LLGLSLShader gSkinnedObjectSimpleWaterProgram;
|
||||
extern LLGLSLShader gSkinnedObjectFullbrightWaterProgram;
|
||||
extern LLGLSLShader gSkinnedObjectEmissiveWaterProgram;
|
||||
extern LLGLSLShader gSkinnedObjectFullbrightShinyWaterProgram;
|
||||
extern LLGLSLShader gSkinnedObjectShinySimpleWaterProgram;
|
||||
|
||||
|
|
@ -368,6 +363,7 @@ extern LLGLSLShader gDeferredWaterProgram;
|
|||
extern LLGLSLShader gDeferredDiffuseProgram;
|
||||
extern LLGLSLShader gDeferredDiffuseAlphaMaskProgram;
|
||||
extern LLGLSLShader gDeferredNonIndexedDiffuseAlphaMaskProgram;
|
||||
extern LLGLSLShader gDeferredNonIndexedDiffuseAlphaMaskNoColorProgram;
|
||||
extern LLGLSLShader gDeferredNonIndexedDiffuseProgram;
|
||||
extern LLGLSLShader gDeferredSkinnedDiffuseProgram;
|
||||
extern LLGLSLShader gDeferredSkinnedBumpProgram;
|
||||
|
|
@ -375,6 +371,7 @@ extern LLGLSLShader gDeferredSkinnedAlphaProgram;
|
|||
extern LLGLSLShader gDeferredBumpProgram;
|
||||
extern LLGLSLShader gDeferredTerrainProgram;
|
||||
extern LLGLSLShader gDeferredTreeProgram;
|
||||
extern LLGLSLShader gDeferredTreeShadowProgram;
|
||||
extern LLGLSLShader gDeferredLightProgram;
|
||||
extern LLGLSLShader gDeferredMultiLightProgram;
|
||||
extern LLGLSLShader gDeferredSpotLightProgram;
|
||||
|
|
@ -394,6 +391,7 @@ extern LLGLSLShader gDeferredAvatarShadowProgram;
|
|||
extern LLGLSLShader gDeferredAttachmentShadowProgram;
|
||||
extern LLGLSLShader gDeferredAlphaProgram;
|
||||
extern LLGLSLShader gDeferredFullbrightProgram;
|
||||
extern LLGLSLShader gDeferredEmissiveProgram;
|
||||
extern LLGLSLShader gDeferredAvatarEyesProgram;
|
||||
extern LLGLSLShader gDeferredAvatarAlphaProgram;
|
||||
extern LLGLSLShader gDeferredWLSkyProgram;
|
||||
|
|
@ -401,8 +399,5 @@ extern LLGLSLShader gDeferredWLCloudProgram;
|
|||
extern LLGLSLShader gDeferredStarProgram;
|
||||
extern LLGLSLShader gLuminanceGatherProgram;
|
||||
|
||||
//current avatar shader parameter pointer
|
||||
extern GLint gAvatarMatrixParam;
|
||||
|
||||
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -1720,10 +1720,7 @@ void LLViewerWindow::initGLDefaults()
|
|||
glCullFace(GL_BACK);
|
||||
|
||||
// RN: Need this for translation and stretch manip.
|
||||
gCone.prerender();
|
||||
gBox.prerender();
|
||||
gSphere.prerender();
|
||||
gCylinder.prerender();
|
||||
}
|
||||
|
||||
struct MainPanel : public LLPanel
|
||||
|
|
@ -2233,6 +2230,10 @@ void LLViewerWindow::drawDebugText()
|
|||
gGL.color4f(1,1,1,1);
|
||||
gGL.pushMatrix();
|
||||
gGL.pushUIMatrix();
|
||||
if (LLGLSLShader::sNoFixedFunction)
|
||||
{
|
||||
gUIProgram.bind();
|
||||
}
|
||||
{
|
||||
// scale view by UI global scale factor and aspect ratio correction factor
|
||||
gGL.scaleUI(mDisplayScale.mV[VX], mDisplayScale.mV[VY], 1.f);
|
||||
|
|
@ -2242,6 +2243,10 @@ void LLViewerWindow::drawDebugText()
|
|||
gGL.popMatrix();
|
||||
|
||||
gGL.flush();
|
||||
if (LLGLSLShader::sNoFixedFunction)
|
||||
{
|
||||
gUIProgram.unbind();
|
||||
}
|
||||
}
|
||||
|
||||
void LLViewerWindow::draw()
|
||||
|
|
@ -3441,26 +3446,26 @@ void LLViewerWindow::renderSelections( BOOL for_gl_pick, BOOL pick_parcel_walls,
|
|||
if (drawable && drawable->isLight())
|
||||
{
|
||||
LLVOVolume* vovolume = drawable->getVOVolume();
|
||||
glPushMatrix();
|
||||
gGL.pushMatrix();
|
||||
|
||||
LLVector3 center = drawable->getPositionAgent();
|
||||
glTranslatef(center[0], center[1], center[2]);
|
||||
gGL.translatef(center[0], center[1], center[2]);
|
||||
F32 scale = vovolume->getLightRadius();
|
||||
glScalef(scale, scale, scale);
|
||||
gGL.scalef(scale, scale, scale);
|
||||
|
||||
LLColor4 color(vovolume->getLightColor(), .5f);
|
||||
gGL.diffuseColor4fv(color.mV);
|
||||
gGL.color4fv(color.mV);
|
||||
|
||||
F32 pixel_area = 100000.f;
|
||||
// Render Outside
|
||||
gSphere.render(pixel_area);
|
||||
gSphere.render();
|
||||
|
||||
// Render Inside
|
||||
glCullFace(GL_FRONT);
|
||||
gSphere.render(pixel_area);
|
||||
gSphere.render();
|
||||
glCullFace(GL_BACK);
|
||||
|
||||
glPopMatrix();
|
||||
gGL.popMatrix();
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
|
@ -4635,10 +4640,7 @@ void LLViewerWindow::stopGL(BOOL save_state)
|
|||
gPipeline.destroyGL();
|
||||
}
|
||||
|
||||
gCone.cleanupGL();
|
||||
gBox.cleanupGL();
|
||||
gSphere.cleanupGL();
|
||||
gCylinder.cleanupGL();
|
||||
|
||||
if(gPostProcess)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -112,20 +112,6 @@ public:
|
|||
glColorPointer(4, GL_UNSIGNED_BYTE, LLVertexBuffer::sTypeSize[TYPE_COLOR], (void*)(base + mOffsets[TYPE_COLOR]));
|
||||
}
|
||||
|
||||
if (data_mask & MAP_WEIGHT)
|
||||
{
|
||||
glVertexAttribPointerARB(1, 1, GL_FLOAT, FALSE, LLVertexBuffer::sTypeSize[TYPE_WEIGHT], (void*)(base + mOffsets[TYPE_WEIGHT]));
|
||||
}
|
||||
|
||||
if (data_mask & MAP_WEIGHT4 && sWeight4Loc != -1)
|
||||
{
|
||||
glVertexAttribPointerARB(sWeight4Loc, 4, GL_FLOAT, FALSE, LLVertexBuffer::sTypeSize[TYPE_WEIGHT4], (void*)(base+mOffsets[TYPE_WEIGHT4]));
|
||||
}
|
||||
|
||||
if (data_mask & MAP_CLOTHWEIGHT)
|
||||
{
|
||||
glVertexAttribPointerARB(4, 4, GL_FLOAT, TRUE, LLVertexBuffer::sTypeSize[TYPE_CLOTHWEIGHT], (void*)(base + mOffsets[TYPE_CLOTHWEIGHT]));
|
||||
}
|
||||
if (data_mask & MAP_VERTEX)
|
||||
{
|
||||
glVertexPointer(3,GL_FLOAT, LLVertexBuffer::sTypeSize[TYPE_VERTEX], (void*)(base + 0));
|
||||
|
|
|
|||
|
|
@ -91,8 +91,9 @@ void LLWLParamSet::update(LLGLSLShader * shader) const
|
|||
val.mV[1] = F32(i->second[1].asReal()) + mCloudScrollYOffset;
|
||||
val.mV[2] = (F32) i->second[2].asReal();
|
||||
val.mV[3] = (F32) i->second[3].asReal();
|
||||
|
||||
shader->uniform4fv(param, 1, val.mV);
|
||||
stop_glerror();
|
||||
shader->uniform4fv(param, 1, val.mV);
|
||||
stop_glerror();
|
||||
}
|
||||
else // param is the uniform name
|
||||
{
|
||||
|
|
@ -118,8 +119,9 @@ void LLWLParamSet::update(LLGLSLShader * shader) const
|
|||
{
|
||||
val.mV[0] = i->second.asBoolean();
|
||||
}
|
||||
|
||||
stop_glerror();
|
||||
shader->uniform4fv(param, 1, val.mV);
|
||||
stop_glerror();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -458,7 +458,7 @@ void LLPipeline::init()
|
|||
}
|
||||
|
||||
mDeferredVB = new LLVertexBuffer(DEFERRED_VB_MASK, 0);
|
||||
mDeferredVB->allocateBuffer(3, 0, true);
|
||||
mDeferredVB->allocateBuffer(8, 0, true);
|
||||
setLightingDetail(-1);
|
||||
}
|
||||
|
||||
|
|
@ -3494,7 +3494,7 @@ void LLPipeline::renderHighlights()
|
|||
if ((LLViewerShaderMgr::instance()->getVertexShaderLevel(LLViewerShaderMgr::SHADER_INTERFACE) > 0))
|
||||
{
|
||||
gHighlightProgram.bind();
|
||||
gHighlightProgram.vertexAttrib4f(LLViewerShaderMgr::MATERIAL_COLOR,1,1,1,0.5f);
|
||||
gHighlightProgram.uniform4f("highlight_color",1,1,1,0.5f);
|
||||
}
|
||||
|
||||
if (hasRenderDebugFeatureMask(RENDER_DEBUG_FEATURE_SELECTED))
|
||||
|
|
@ -3526,7 +3526,7 @@ void LLPipeline::renderHighlights()
|
|||
color.setVec(1.f, 0.f, 0.f, 0.5f);
|
||||
if ((LLViewerShaderMgr::instance()->getVertexShaderLevel(LLViewerShaderMgr::SHADER_INTERFACE) > 0))
|
||||
{
|
||||
gHighlightProgram.vertexAttrib4f(LLViewerShaderMgr::MATERIAL_COLOR,1,0,0,0.5f);
|
||||
gHighlightProgram.uniform4f("highlight_color",1,0,0,0.5f);
|
||||
}
|
||||
int count = mHighlightFaces.size();
|
||||
for (S32 i = 0; i < count; i++)
|
||||
|
|
@ -7021,7 +7021,7 @@ void LLPipeline::renderDeferredLighting()
|
|||
LLVector4 dir(mSunDir, 0.f);
|
||||
glh::vec4f tc(dir.mV);
|
||||
mat.mult_matrix_vec(tc);
|
||||
mTransformedSunDir.set(dir.mV);
|
||||
mTransformedSunDir.set(tc.v);
|
||||
}
|
||||
|
||||
glPushMatrix();
|
||||
|
|
@ -7036,7 +7036,7 @@ void LLPipeline::renderDeferredLighting()
|
|||
{ //paint shadow/SSAO light map (direct lighting lightmap)
|
||||
LLFastTimer ftm(FTM_SUN_SHADOW);
|
||||
bindDeferredShader(gDeferredSunProgram, 0);
|
||||
|
||||
mDeferredVB->setBuffer(LLVertexBuffer::MAP_VERTEX);
|
||||
glClearColor(1,1,1,1);
|
||||
mDeferredLight[0].clear(GL_COLOR_BUFFER_BIT);
|
||||
glClearColor(0,0,0,0);
|
||||
|
|
@ -7067,7 +7067,7 @@ void LLPipeline::renderDeferredLighting()
|
|||
LLGLDisable blend(GL_BLEND);
|
||||
LLGLDepthTest depth(GL_TRUE, GL_FALSE, GL_ALWAYS);
|
||||
stop_glerror();
|
||||
glDrawArrays(GL_TRIANGLE_STRIP, 0, 3);
|
||||
mDeferredVB->drawArrays(LLRender::TRIANGLES, 0, 3);
|
||||
stop_glerror();
|
||||
}
|
||||
|
||||
|
|
@ -7091,7 +7091,8 @@ void LLPipeline::renderDeferredLighting()
|
|||
gDeferredEdgeProgram.bind();
|
||||
mEdgeMap.bindTarget();
|
||||
bindDeferredShader(gDeferredEdgeProgram);
|
||||
glDrawArrays(GL_TRIANGLE_STRIP, 0, 3);
|
||||
mDeferredVB->setBuffer(LLVertexBuffer::MAP_VERTEX);
|
||||
mDeferredVB->drawArrays(LLRender::TRIANGLES, 0, 3);
|
||||
unbindDeferredShader(gDeferredEdgeProgram);
|
||||
mEdgeMap.flush();
|
||||
}
|
||||
|
|
@ -7113,7 +7114,8 @@ void LLPipeline::renderDeferredLighting()
|
|||
gLuminanceGatherProgram.uniform2f("screen_res", mDeferredLight[0].getWidth(), mDeferredLight[0].getHeight());
|
||||
mLuminanceMap.bindTarget();
|
||||
bindDeferredShader(gLuminanceGatherProgram);
|
||||
glDrawArrays(GL_TRIANGLE_STRIP, 0, 3);
|
||||
mDeferredVB->setBuffer(LLVertexBuffer::MAP_VERTEX);
|
||||
mDeferredVB->drawArrays(LLRender::TRIANGLES, 0, 3);
|
||||
unbindDeferredShader(gLuminanceGatherProgram);
|
||||
mLuminanceMap.flush();
|
||||
gGL.getTexUnit(0)->bindManual(LLTexUnit::TT_TEXTURE, mLuminanceMap.getTexture(), true);
|
||||
|
|
@ -7131,7 +7133,8 @@ void LLPipeline::renderDeferredLighting()
|
|||
mGIMapPost[0].bindTarget();
|
||||
|
||||
bindDeferredShader(gDeferredGIProgram, 0, &mGIMap, 0, mTrueNoiseMap);
|
||||
glDrawArrays(GL_TRIANGLE_STRIP, 0, 3);
|
||||
mDeferredVB->setBuffer(LLVertexBuffer::MAP_VERTEX);
|
||||
mDeferredVB->drawArrays(LLRender::TRIANGLES, 0, 3);
|
||||
unbindDeferredShader(gDeferredGIProgram);
|
||||
mGIMapPost[0].flush();
|
||||
}
|
||||
|
|
@ -7156,7 +7159,8 @@ void LLPipeline::renderDeferredLighting()
|
|||
LLGLDisable blend(GL_BLEND);
|
||||
LLGLDepthTest depth(GL_FALSE);
|
||||
stop_glerror();
|
||||
glDrawArrays(GL_TRIANGLE_STRIP, 0, 3);
|
||||
mDeferredVB->setBuffer(LLVertexBuffer::MAP_VERTEX);
|
||||
mDeferredVB->drawArrays(LLRender::TRIANGLES, 0, 3);
|
||||
stop_glerror();
|
||||
}
|
||||
|
||||
|
|
@ -7171,7 +7175,8 @@ void LLPipeline::renderDeferredLighting()
|
|||
LLGLDisable blend(GL_BLEND);
|
||||
LLGLDepthTest depth(GL_FALSE);
|
||||
stop_glerror();
|
||||
glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
|
||||
mDeferredVB->setBuffer(LLVertexBuffer::MAP_VERTEX);
|
||||
mDeferredVB->drawArrays(LLRender::TRIANGLES, 0, 3);
|
||||
stop_glerror();
|
||||
}
|
||||
mGIMapPost[0].flush();
|
||||
|
|
@ -7185,13 +7190,12 @@ void LLPipeline::renderDeferredLighting()
|
|||
LLFastTimer ftm(FTM_SOFTEN_SHADOW);
|
||||
//blur lightmap
|
||||
mDeferredLight[1].bindTarget();
|
||||
|
||||
glClearColor(1,1,1,1);
|
||||
mDeferredLight[1].clear(GL_COLOR_BUFFER_BIT);
|
||||
glClearColor(0,0,0,0);
|
||||
|
||||
bindDeferredShader(gDeferredBlurLightProgram);
|
||||
|
||||
mDeferredVB->setBuffer(LLVertexBuffer::MAP_VERTEX);
|
||||
LLVector3 go = gSavedSettings.getVector3("RenderShadowGaussian");
|
||||
const U32 kern_length = 4;
|
||||
F32 blur_size = gSavedSettings.getF32("RenderShadowBlurSize");
|
||||
|
|
@ -7219,7 +7223,7 @@ void LLPipeline::renderDeferredLighting()
|
|||
LLGLDisable blend(GL_BLEND);
|
||||
LLGLDepthTest depth(GL_TRUE, GL_FALSE, GL_ALWAYS);
|
||||
stop_glerror();
|
||||
glDrawArrays(GL_TRIANGLE_STRIP, 0, 3);
|
||||
mDeferredVB->drawArrays(LLRender::TRIANGLES, 0, 3);
|
||||
stop_glerror();
|
||||
}
|
||||
|
||||
|
|
@ -7227,6 +7231,7 @@ void LLPipeline::renderDeferredLighting()
|
|||
unbindDeferredShader(gDeferredBlurLightProgram);
|
||||
|
||||
bindDeferredShader(gDeferredBlurLightProgram, 1);
|
||||
mDeferredVB->setBuffer(LLVertexBuffer::MAP_VERTEX);
|
||||
mDeferredLight[0].bindTarget();
|
||||
|
||||
gDeferredBlurLightProgram.uniform2f("delta", 0.f, 1.f);
|
||||
|
|
@ -7235,7 +7240,7 @@ void LLPipeline::renderDeferredLighting()
|
|||
LLGLDisable blend(GL_BLEND);
|
||||
LLGLDepthTest depth(GL_TRUE, GL_FALSE, GL_ALWAYS);
|
||||
stop_glerror();
|
||||
glDrawArrays(GL_TRIANGLE_STRIP, 0, 3);
|
||||
mDeferredVB->drawArrays(LLRender::TRIANGLES, 0, 3);
|
||||
stop_glerror();
|
||||
}
|
||||
mDeferredLight[0].flush();
|
||||
|
|
@ -7338,12 +7343,12 @@ void LLPipeline::renderDeferredLighting()
|
|||
std::list<LLVector4> light_colors;
|
||||
|
||||
LLVertexBuffer::unbind();
|
||||
LLVector4a* v = (LLVector4a*) vert.get();
|
||||
|
||||
F32 v[24];
|
||||
glVertexPointer(3, GL_FLOAT, 0, v);
|
||||
|
||||
{
|
||||
bindDeferredShader(gDeferredLightProgram);
|
||||
mDeferredVB->setBuffer(LLVertexBuffer::MAP_VERTEX);
|
||||
|
||||
LLGLDepthTest depth(GL_TRUE, GL_FALSE);
|
||||
for (LLDrawable::drawable_set_t::iterator iter = mLights.begin(); iter != mLights.end(); ++iter)
|
||||
{
|
||||
|
|
@ -7398,15 +7403,15 @@ void LLPipeline::renderDeferredLighting()
|
|||
//correspond to their axis facing, with bit position 3,2,1 matching
|
||||
//axis facing x,y,z, bit set meaning positive facing, bit clear
|
||||
//meaning negative facing
|
||||
v[0] = c[0]-s; v[1] = c[1]-s; v[2] = c[2]-s; // 0 - 0000
|
||||
v[3] = c[0]-s; v[4] = c[1]-s; v[5] = c[2]+s; // 1 - 0001
|
||||
v[6] = c[0]-s; v[7] = c[1]+s; v[8] = c[2]-s; // 2 - 0010
|
||||
v[9] = c[0]-s; v[10] = c[1]+s; v[11] = c[2]+s; // 3 - 0011
|
||||
v[0].set(c[0]-s,c[1]-s,c[2]-s); // 0 - 0000
|
||||
v[1].set(c[0]-s,c[1]-s,c[2]+s); // 1 - 0001
|
||||
v[2].set(c[0]-s,c[1]+s,c[2]-s); // 2 - 0010
|
||||
v[3].set(c[0]-s,c[1]+s,c[2]+s); // 3 - 0011
|
||||
|
||||
v[12] = c[0]+s; v[13] = c[1]-s; v[14] = c[2]-s; // 4 - 0100
|
||||
v[15] = c[0]+s; v[16] = c[1]-s; v[17] = c[2]+s; // 5 - 0101
|
||||
v[18] = c[0]+s; v[19] = c[1]+s; v[20] = c[2]-s; // 6 - 0110
|
||||
v[21] = c[0]+s; v[22] = c[1]+s; v[23] = c[2]+s; // 7 - 0111
|
||||
v[4].set(c[0]+s,c[1]-s,c[2]-s); // 4 - 0100
|
||||
v[5].set(c[0]+s,c[1]-s,c[2]+s); // 5 - 0101
|
||||
v[6].set(c[0]+s,c[1]+s,c[2]-s); // 6 - 0110
|
||||
v[7].set(c[0]+s,c[1]+s,c[2]+s); // 7 - 0111
|
||||
|
||||
if (camera->getOrigin().mV[0] > c[0] + s + 0.2f ||
|
||||
camera->getOrigin().mV[0] < c[0] - s - 0.2f ||
|
||||
|
|
@ -7425,8 +7430,12 @@ void LLPipeline::renderDeferredLighting()
|
|||
}
|
||||
|
||||
LLFastTimer ftm(FTM_LOCAL_LIGHTS);
|
||||
glTexCoord4f(tc.v[0], tc.v[1], tc.v[2], s*s);
|
||||
gGL.diffuseColor4f(col.mV[0], col.mV[1], col.mV[2], volume->getLightFalloff()*0.5f);
|
||||
//glTexCoord4f(tc.v[0], tc.v[1], tc.v[2], s*s);
|
||||
gDeferredLightProgram.uniform3fv("center", 1, tc.v);
|
||||
gDeferredLightProgram.uniform1f("size", s*s);
|
||||
gDeferredLightProgram.uniform3fv("color", 1, col.mV);
|
||||
gDeferredLightProgram.uniform1f("falloff", volume->getLightFalloff()*0.5f);
|
||||
//gGL.diffuseColor4f(col.mV[0], col.mV[1], col.mV[2], volume->getLightFalloff()*0.5f);
|
||||
glDrawRangeElements(GL_TRIANGLE_FAN, 0, 7, 8,
|
||||
GL_UNSIGNED_BYTE, get_box_fan_indices_ptr(camera, center));
|
||||
stop_glerror();
|
||||
|
|
@ -7453,6 +7462,8 @@ void LLPipeline::renderDeferredLighting()
|
|||
LLGLDepthTest depth(GL_TRUE, GL_FALSE);
|
||||
bindDeferredShader(gDeferredSpotLightProgram);
|
||||
|
||||
mDeferredVB->setBuffer(LLVertexBuffer::MAP_VERTEX);
|
||||
|
||||
gDeferredSpotLightProgram.enableTexture(LLViewerShaderMgr::DEFERRED_PROJECTION);
|
||||
|
||||
for (LLDrawable::drawable_list_t::iterator iter = spot_lights.begin(); iter != spot_lights.end(); ++iter)
|
||||
|
|
@ -7481,18 +7492,20 @@ void LLPipeline::renderDeferredLighting()
|
|||
//correspond to their axis facing, with bit position 3,2,1 matching
|
||||
//axis facing x,y,z, bit set meaning positive facing, bit clear
|
||||
//meaning negative facing
|
||||
v[0] = c[0]-s; v[1] = c[1]-s; v[2] = c[2]-s; // 0 - 0000
|
||||
v[3] = c[0]-s; v[4] = c[1]-s; v[5] = c[2]+s; // 1 - 0001
|
||||
v[6] = c[0]-s; v[7] = c[1]+s; v[8] = c[2]-s; // 2 - 0010
|
||||
v[9] = c[0]-s; v[10] = c[1]+s; v[11] = c[2]+s; // 3 - 0011
|
||||
v[0].set(c[0]-s,c[1]-s,c[2]-s); // 0 - 0000
|
||||
v[1].set(c[0]-s,c[1]-s,c[2]+s); // 1 - 0001
|
||||
v[2].set(c[0]-s,c[1]+s,c[2]-s); // 2 - 0010
|
||||
v[3].set(c[0]-s,c[1]+s,c[2]+s); // 3 - 0011
|
||||
|
||||
v[12] = c[0]+s; v[13] = c[1]-s; v[14] = c[2]-s; // 4 - 0100
|
||||
v[15] = c[0]+s; v[16] = c[1]-s; v[17] = c[2]+s; // 5 - 0101
|
||||
v[18] = c[0]+s; v[19] = c[1]+s; v[20] = c[2]-s; // 6 - 0110
|
||||
v[21] = c[0]+s; v[22] = c[1]+s; v[23] = c[2]+s; // 7 - 0111
|
||||
|
||||
glTexCoord4f(tc.v[0], tc.v[1], tc.v[2], s*s);
|
||||
gGL.diffuseColor4f(col.mV[0], col.mV[1], col.mV[2], volume->getLightFalloff()*0.5f);
|
||||
v[4].set(c[0]+s,c[1]-s,c[2]-s); // 4 - 0100
|
||||
v[5].set(c[0]+s,c[1]-s,c[2]+s); // 5 - 0101
|
||||
v[6].set(c[0]+s,c[1]+s,c[2]-s); // 6 - 0110
|
||||
v[7].set(c[0]+s,c[1]+s,c[2]+s); // 7 - 0111
|
||||
|
||||
gDeferredSpotLightProgram.uniform3fv("center", 1, tc.v);
|
||||
gDeferredSpotLightProgram.uniform1f("size", s*s);
|
||||
gDeferredSpotLightProgram.uniform3fv("color", 1, col.mV);
|
||||
gDeferredSpotLightProgram.uniform1f("falloff", volume->getLightFalloff()*0.5f);
|
||||
glDrawRangeElements(GL_TRIANGLE_FAN, 0, 7, 8,
|
||||
GL_UNSIGNED_BYTE, get_box_fan_indices_ptr(camera, center));
|
||||
}
|
||||
|
|
@ -7500,6 +7513,11 @@ void LLPipeline::renderDeferredLighting()
|
|||
unbindDeferredShader(gDeferredSpotLightProgram);
|
||||
}
|
||||
|
||||
//reset mDeferredVB to fullscreen triangle
|
||||
vert[0].set(-1,1,0);
|
||||
vert[1].set(-1,-3,0);
|
||||
vert[2].set(3,1,0);
|
||||
|
||||
{
|
||||
bindDeferredShader(gDeferredMultiLightProgram);
|
||||
|
||||
|
|
@ -7554,6 +7572,8 @@ void LLPipeline::renderDeferredLighting()
|
|||
|
||||
gDeferredMultiSpotLightProgram.enableTexture(LLViewerShaderMgr::DEFERRED_PROJECTION);
|
||||
|
||||
mDeferredVB->setBuffer(LLVertexBuffer::MAP_VERTEX);
|
||||
|
||||
for (LLDrawable::drawable_list_t::iterator iter = fullscreen_spot_lights.begin(); iter != fullscreen_spot_lights.end(); ++iter)
|
||||
{
|
||||
LLFastTimer ftm(FTM_PROJECTORS);
|
||||
|
|
@ -7575,9 +7595,11 @@ void LLPipeline::renderDeferredLighting()
|
|||
LLColor3 col = volume->getLightColor();
|
||||
col *= volume->getLightIntensity();
|
||||
|
||||
glTexCoord4f(tc.v[0], tc.v[1], tc.v[2], s*s);
|
||||
gGL.diffuseColor4f(col.mV[0], col.mV[1], col.mV[2], volume->getLightFalloff()*0.5f);
|
||||
glDrawArrays(GL_TRIANGLE_STRIP, 0, 3);
|
||||
gDeferredMultiSpotLightProgram.uniform3fv("center", 1, tc.v);
|
||||
gDeferredMultiSpotLightProgram.uniform1f("size", s*s);
|
||||
gDeferredMultiSpotLightProgram.uniform3fv("color", 1, col.mV);
|
||||
gDeferredMultiSpotLightProgram.uniform1f("falloff", volume->getLightFalloff()*0.5f);
|
||||
mDeferredVB->drawArrays(LLRender::TRIANGLES, 0, 3);
|
||||
}
|
||||
|
||||
gDeferredMultiSpotLightProgram.disableTexture(LLViewerShaderMgr::DEFERRED_PROJECTION);
|
||||
|
|
@ -7610,7 +7632,7 @@ void LLPipeline::renderDeferredLighting()
|
|||
bindDeferredShader(gDeferredPostProgram, 0, &mGIMapPost[0]);
|
||||
|
||||
gDeferredPostProgram.bind();
|
||||
|
||||
mDeferredVB->setBuffer(LLVertexBuffer::MAP_VERTEX);
|
||||
LLVertexBuffer::unbind();
|
||||
|
||||
// glVertexPointer(2, GL_FLOAT, 0, vert);
|
||||
|
|
@ -7622,8 +7644,8 @@ void LLPipeline::renderDeferredLighting()
|
|||
glPushMatrix();
|
||||
glLoadIdentity();
|
||||
|
||||
glDrawArrays(GL_TRIANGLES, 0, 3);
|
||||
|
||||
mDeferredVB->drawArrays(LLRender::TRIANGLES, 0, 3);
|
||||
|
||||
glPopMatrix();
|
||||
glMatrixMode(GL_MODELVIEW);
|
||||
glPopMatrix();
|
||||
|
|
@ -8294,12 +8316,14 @@ void LLPipeline::renderShadow(glh::matrix4f& view, glh::matrix4f& proj, LLCamera
|
|||
gDeferredShadowAlphaMaskProgram.bind();
|
||||
gDeferredShadowAlphaMaskProgram.setAlphaRange(0.6f, 1.f);
|
||||
renderObjects(LLRenderPass::PASS_ALPHA_SHADOW, LLVertexBuffer::MAP_VERTEX | LLVertexBuffer::MAP_TEXCOORD0 | LLVertexBuffer::MAP_COLOR, TRUE);
|
||||
gGL.diffuseColor4f(1,1,1,1);
|
||||
gDeferredTreeShadowProgram.bind();
|
||||
gDeferredTreeShadowProgram.setAlphaRange(0.6f, 1.f);
|
||||
renderObjects(LLRenderPass::PASS_GRASS, LLVertexBuffer::MAP_VERTEX | LLVertexBuffer::MAP_TEXCOORD0, TRUE);
|
||||
}
|
||||
|
||||
//glCullFace(GL_BACK);
|
||||
|
||||
gDeferredShadowProgram.bind();
|
||||
gGLLastMatrix = NULL;
|
||||
glLoadMatrixd(gGLModelView);
|
||||
doOcclusion(shadow_cam);
|
||||
|
|
@ -9676,6 +9700,11 @@ void LLPipeline::generateImpostor(LLVOAvatar* avatar)
|
|||
|
||||
static const F32 clip_plane = 0.99999f;
|
||||
|
||||
if (LLGLSLShader::sNoFixedFunction)
|
||||
{
|
||||
gUIProgram.bind();
|
||||
}
|
||||
|
||||
gGL.color4ub(64,64,64,255);
|
||||
gGL.begin(LLRender::QUADS);
|
||||
gGL.vertex3f(-1, -1, clip_plane);
|
||||
|
|
@ -9685,6 +9714,11 @@ void LLPipeline::generateImpostor(LLVOAvatar* avatar)
|
|||
gGL.end();
|
||||
gGL.flush();
|
||||
|
||||
if (LLGLSLShader::sNoFixedFunction)
|
||||
{
|
||||
gUIProgram.unbind();
|
||||
}
|
||||
|
||||
glPopMatrix();
|
||||
glMatrixMode(GL_MODELVIEW);
|
||||
glPopMatrix();
|
||||
|
|
|
|||
Loading…
Reference in New Issue