- Timestamp:
- 08/27/11 16:31:24 (13 years ago)
- Location:
- ps/trunk/source
- Files:
-
- 1 added
- 5 edited
-
graphics/ShaderManager.cpp (modified) (3 diffs)
-
graphics/ShaderProgram.cpp (modified) (3 diffs)
-
graphics/ShaderProgram.h (modified) (5 diffs)
-
graphics/ShaderProgramFFP.cpp (added)
-
renderer/OverlayRenderer.cpp (modified) (4 diffs)
-
renderer/Renderer.h (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
-
ps/trunk/source/graphics/ShaderManager.cpp
r9410 r10106 63 63 64 64 CShaderProgramPtr program; 65 if ( NewProgram(name, defines, program) != PSRETURN_OK)65 if (!NewProgram(name, defines, program)) 66 66 { 67 67 LOGERROR(L"Failed to load shader '%hs'", name); … … 75 75 bool CShaderManager::NewProgram(const char* name, const std::map<CStr, CStr>& baseDefines, CShaderProgramPtr& program) 76 76 { 77 if (strncmp(name, "fixed:", 6) == 0) 78 { 79 program = CShaderProgramPtr(CShaderProgram::ConstructFFP(name+6)); 80 if (!program) 81 return false; 82 program->Reload(); 83 return true; 84 } 85 77 86 VfsPath xmlFilename = L"shaders/" + wstring_from_utf8(name) + L".xml"; 78 87 … … 185 194 m_HotloadFiles[fragmentFile].insert(program); 186 195 187 return PSRETURN_OK;196 return true; 188 197 } 189 198 -
ps/trunk/source/graphics/ShaderProgram.cpp
r9123 r10106 198 198 } 199 199 200 virtual void Uniform(uniform_id_t id, int v)201 {202 Uniform(Binding(GetUniformVertexIndex(id), GetUniformFragmentIndex(id)), (float)v, (float)v, (float)v, (float)v);203 }204 205 virtual void Uniform(Binding id, int v)206 {207 Uniform(id, (float)v, (float)v, (float)v, (float)v);208 }209 210 virtual void Uniform(uniform_id_t id, float v)211 {212 Uniform(Binding(GetUniformVertexIndex(id), GetUniformFragmentIndex(id)), v, v, v, v);213 }214 215 virtual void Uniform(Binding id, float v)216 {217 Uniform(id, v, v, v, v);218 }219 220 virtual void Uniform(uniform_id_t id, float v0, float v1, float v2, float v3)221 {222 Uniform(Binding(GetUniformVertexIndex(id), GetUniformFragmentIndex(id)), v0, v1, v2, v3);223 }224 225 200 virtual void Uniform(Binding id, float v0, float v1, float v2, float v3) 226 201 { … … 230 205 if (id.fragment != -1) 231 206 pglProgramLocalParameter4fARB(GL_FRAGMENT_PROGRAM_ARB, (GLuint)id.fragment, v0, v1, v2, v3); 232 }233 234 virtual void Uniform(uniform_id_t id, const CVector3D& v)235 {236 Uniform(Binding(GetUniformVertexIndex(id), GetUniformFragmentIndex(id)), v.X, v.Y, v.Z, 0.0f);237 }238 239 virtual void Uniform(Binding id, const CVector3D& v)240 {241 Uniform(id, v.X, v.Y, v.Z, 0.0f);242 }243 244 virtual void Uniform(uniform_id_t id, const CColor& v)245 {246 Uniform(Binding(GetUniformVertexIndex(id), GetUniformFragmentIndex(id)), v.r, v.g, v.b, v.a);247 }248 249 virtual void Uniform(Binding id, const CColor& v)250 {251 Uniform(id, v.r, v.g, v.b, v.a);252 }253 254 virtual void Uniform(uniform_id_t id, const CMatrix3D& v)255 {256 Uniform(Binding(GetUniformVertexIndex(id), GetUniformFragmentIndex(id)), v);257 207 } 258 208 … … 312 262 return m_StreamFlags; 313 263 } 264 265 void CShaderProgram::Uniform(Binding id, int v) 266 { 267 Uniform(id, (float)v, (float)v, (float)v, (float)v); 268 } 269 270 void CShaderProgram::Uniform(Binding id, float v) 271 { 272 Uniform(id, v, v, v, v); 273 } 274 275 void CShaderProgram::Uniform(Binding id, const CVector3D& v) 276 { 277 Uniform(id, v.X, v.Y, v.Z, 0.0f); 278 } 279 280 void CShaderProgram::Uniform(Binding id, const CColor& v) 281 { 282 Uniform(id, v.r, v.g, v.b, v.a); 283 } 284 285 void CShaderProgram::Uniform(uniform_id_t id, int v) 286 { 287 Uniform(GetUniformBinding(id), (float)v, (float)v, (float)v, (float)v); 288 } 289 290 void CShaderProgram::Uniform(uniform_id_t id, float v) 291 { 292 Uniform(GetUniformBinding(id), v, v, v, v); 293 } 294 295 void CShaderProgram::Uniform(uniform_id_t id, const CVector3D& v) 296 { 297 Uniform(GetUniformBinding(id), v.X, v.Y, v.Z, 0.0f); 298 } 299 300 void CShaderProgram::Uniform(uniform_id_t id, const CColor& v) 301 { 302 Uniform(GetUniformBinding(id), v.r, v.g, v.b, v.a); 303 } 304 305 void CShaderProgram::Uniform(uniform_id_t id, float v0, float v1, float v2, float v3) 306 { 307 Uniform(GetUniformBinding(id), v0, v1, v2, v3); 308 } 309 310 void CShaderProgram::Uniform(uniform_id_t id, const CMatrix3D& v) 311 { 312 Uniform(GetUniformBinding(id), v); 313 } -
ps/trunk/source/graphics/ShaderProgram.h
r10017 r10106 30 30 class CVector3D; 31 31 32 // Vertex data stream flags 33 enum 34 { 35 STREAM_POS = (1 << 0), 36 STREAM_NORMAL = (1 << 1), 37 STREAM_COLOR = (1 << 2), 38 STREAM_UV0 = (1 << 3), 39 STREAM_UV1 = (1 << 4), 40 STREAM_UV2 = (1 << 5), 41 STREAM_UV3 = (1 << 6), 42 STREAM_POSTOUV0 = (1 << 7), 43 STREAM_POSTOUV1 = (1 << 8), 44 STREAM_POSTOUV2 = (1 << 9), 45 STREAM_POSTOUV3 = (1 << 10) 46 }; 47 32 48 /** 33 49 * A compiled vertex+fragment shader program. … … 53 69 int streamflags); 54 70 71 /** 72 * Construct an instance of a pre-defined fixed-function pipeline setup. 73 */ 74 static CShaderProgram* ConstructFFP(const std::string& id); 75 55 76 typedef const char* attrib_id_t; 56 77 typedef const char* texture_id_t; … … 62 83 struct Binding 63 84 { 64 friend class CShaderProgramARB;65 private:66 85 Binding(int v, int f) : vertex((i16)v), fragment((i16)f) { } 67 i16 vertex; 68 i16 fragment; 69 public: 86 70 87 Binding() : vertex(-1), fragment(-1) { } 71 88 … … 75 92 */ 76 93 bool Active() { return vertex != -1 || fragment != -1; } 94 95 i16 vertex; 96 i16 fragment; 77 97 }; 78 98 … … 117 137 virtual Binding GetUniformBinding(uniform_id_t id) = 0; 118 138 119 virtual void Uniform(uniform_id_t id, int v) = 0; 120 virtual void Uniform(uniform_id_t id, float v) = 0; 121 virtual void Uniform(uniform_id_t id, float v0, float v1, float v2, float v3) = 0; 122 virtual void Uniform(uniform_id_t id, const CVector3D& v) = 0; 123 virtual void Uniform(uniform_id_t id, const CColor& v) = 0; 124 virtual void Uniform(uniform_id_t id, const CMatrix3D& v) = 0; 139 // Uniform-setting methods that subclasses must define: 140 virtual void Uniform(Binding id, float v0, float v1, float v2, float v3) = 0; 141 virtual void Uniform(Binding id, const CMatrix3D& v) = 0; 125 142 126 virtual void Uniform(Binding id, int v) = 0; 127 virtual void Uniform(Binding id, float v) = 0; 128 virtual void Uniform(Binding id, float v0, float v1, float v2, float v3) = 0; 129 virtual void Uniform(Binding id, const CVector3D& v) = 0; 130 virtual void Uniform(Binding id, const CColor& v) = 0; 131 virtual void Uniform(Binding id, const CMatrix3D& v) = 0; 143 // Convenient uniform-setting wrappers: 144 145 void Uniform(Binding id, int v); 146 void Uniform(Binding id, float v); 147 void Uniform(Binding id, const CVector3D& v); 148 void Uniform(Binding id, const CColor& v); 149 150 void Uniform(uniform_id_t id, int v); 151 void Uniform(uniform_id_t id, float v); 152 void Uniform(uniform_id_t id, const CVector3D& v); 153 void Uniform(uniform_id_t id, const CColor& v); 154 void Uniform(uniform_id_t id, float v0, float v1, float v2, float v3); 155 void Uniform(uniform_id_t id, const CMatrix3D& v); 132 156 133 157 protected: -
ps/trunk/source/renderer/OverlayRenderer.cpp
r9929 r10106 169 169 PROFILE("render overlays (after water)"); 170 170 171 // Only supported in shader modes172 // (TODO: should support in non-shader too)173 if (g_Renderer.GetRenderPath() != CRenderer::RP_SHADER)174 return;175 176 171 if (!m->texlines.empty()) 177 172 { … … 180 175 glDepthMask(0); 181 176 182 glEnableClientState(GL_VERTEX_ARRAY); 183 glEnableClientState(GL_TEXTURE_COORD_ARRAY); 177 const char* shaderName; 178 if (g_Renderer.GetRenderPath() == CRenderer::RP_SHADER) 179 shaderName = "overlayline"; 180 else 181 shaderName = "fixed:overlayline"; 184 182 185 183 CShaderManager& shaderManager = g_Renderer.GetShaderManager(); 186 CShaderProgramPtr shaderTexLine(shaderManager.LoadProgram( "overlayline", std::map<CStr, CStr>()));184 CShaderProgramPtr shaderTexLine(shaderManager.LoadProgram(shaderName, std::map<CStr, CStr>())); 187 185 188 186 shaderTexLine->Bind(); 187 188 int streamflags = shaderTexLine->GetStreamFlags(); 189 190 if (streamflags & STREAM_POS) 191 glEnableClientState(GL_VERTEX_ARRAY); 192 193 if (streamflags & STREAM_UV0) 194 { 195 pglClientActiveTextureARB(GL_TEXTURE0); 196 glEnableClientState(GL_TEXTURE_COORD_ARRAY); 197 } 198 199 if (streamflags & STREAM_UV1) 200 { 201 pglClientActiveTextureARB(GL_TEXTURE1); 202 glEnableClientState(GL_TEXTURE_COORD_ARRAY); 203 } 189 204 190 205 CLOSTexture& los = g_Renderer.GetScene().GetLOSTexture(); … … 207 222 CTexturedLineRData::SVertex* base = reinterpret_cast<CTexturedLineRData::SVertex*>(rdata->m_VB->m_Owner->Bind()); 208 223 209 glVertexPointer(3, GL_FLOAT, stride, &base->m_Position[0]); 210 glTexCoordPointer(2, GL_SHORT, stride, &base->m_UVs[0]); 224 if (streamflags & STREAM_POS) 225 glVertexPointer(3, GL_FLOAT, stride, &base->m_Position[0]); 226 227 if (streamflags & STREAM_UV0) 228 { 229 pglClientActiveTextureARB(GL_TEXTURE0); 230 glTexCoordPointer(2, GL_SHORT, stride, &base->m_UVs[0]); 231 } 232 233 if (streamflags & STREAM_UV1) 234 { 235 pglClientActiveTextureARB(GL_TEXTURE1); 236 glTexCoordPointer(2, GL_SHORT, stride, &base->m_UVs[0]); 237 } 211 238 212 239 u8* indexBase = rdata->m_VBIndices->m_Owner->Bind(); … … 224 251 CVertexBuffer::Unbind(); 225 252 glDisableClientState(GL_VERTEX_ARRAY); 253 pglClientActiveTextureARB(GL_TEXTURE1); 254 glDisableClientState(GL_TEXTURE_COORD_ARRAY); 255 pglClientActiveTextureARB(GL_TEXTURE0); 226 256 glDisableClientState(GL_TEXTURE_COORD_ARRAY); 227 257 -
ps/trunk/source/renderer/Renderer.h
r9929 r10106 51 51 // transparency modes 52 52 enum ETransparentMode { TRANSPARENT, TRANSPARENT_OPAQUE, TRANSPARENT_BLEND }; 53 54 // stream flags55 #define STREAM_POS (1 << 0)56 #define STREAM_NORMAL (1 << 1)57 #define STREAM_COLOR (1 << 2)58 #define STREAM_UV0 (1 << 3)59 #define STREAM_UV1 (1 << 4)60 #define STREAM_UV2 (1 << 5)61 #define STREAM_UV3 (1 << 6)62 #define STREAM_POSTOUV0 (1 << 7)63 #define STREAM_POSTOUV1 (1 << 8)64 #define STREAM_POSTOUV2 (1 << 9)65 #define STREAM_POSTOUV3 (1 << 10)66 53 67 54 // access to sole renderer object
Note:
See TracChangeset
for help on using the changeset viewer.
