- attempt to better handler tomreyn's fuzzer.

This commit is contained in:
Mark Vejvoda 2011-01-12 06:52:03 +00:00
parent 26a382bd64
commit 6bfc4d7c2e
1 changed files with 28 additions and 24 deletions

View File

@ -19,7 +19,7 @@
using namespace Shared::Platform;
namespace Shared{ namespace Graphics{ namespace Gl{
namespace Shared { namespace Graphics { namespace Gl {
// =====================================================
// class MyClass
@ -27,15 +27,15 @@ namespace Shared{ namespace Graphics{ namespace Gl{
// ===================== PUBLIC ========================
ModelRendererGl::ModelRendererGl(){
ModelRendererGl::ModelRendererGl() {
rendering= false;
duplicateTexCoords= false;
secondaryTexCoordUnit= 1;
}
void ModelRendererGl::begin(bool renderNormals, bool renderTextures, bool renderColors, MeshCallback *meshCallback){
void ModelRendererGl::begin(bool renderNormals, bool renderTextures, bool renderColors, MeshCallback *meshCallback) {
//assertions
assert(!rendering);
assert(rendering == false);
assertGl();
this->renderTextures= renderTextures;
@ -81,7 +81,7 @@ void ModelRendererGl::begin(bool renderNormals, bool renderTextures, bool render
assertGl();
}
void ModelRendererGl::end(){
void ModelRendererGl::end() {
//assertions
assert(rendering);
assertGl();
@ -97,13 +97,13 @@ void ModelRendererGl::end(){
assertGl();
}
void ModelRendererGl::render(const Model *model){
void ModelRendererGl::render(const Model *model) {
//assertions
assert(rendering);
assertGl();
//render every mesh
for(uint32 i=0; i<model->getMeshCount(); ++i){
for(uint32 i=0; i<model->getMeshCount(); ++i) {
renderMesh(model->getMesh(i));
}
@ -111,13 +111,13 @@ void ModelRendererGl::render(const Model *model){
assertGl();
}
void ModelRendererGl::renderNormalsOnly(const Model *model){
void ModelRendererGl::renderNormalsOnly(const Model *model) {
//assertions
assert(rendering);
assertGl();
//render every mesh
for(uint32 i=0; i<model->getMeshCount(); ++i){
for(uint32 i=0; i<model->getMeshCount(); ++i) {
renderMeshNormals(model->getMesh(i));
}
@ -127,13 +127,13 @@ void ModelRendererGl::renderNormalsOnly(const Model *model){
// ===================== PRIVATE =======================
void ModelRendererGl::renderMesh(const Mesh *mesh){
void ModelRendererGl::renderMesh(const Mesh *mesh) {
//assertions
assertGl();
//set cull face
if(mesh->getTwoSided()){
if(mesh->getTwoSided()) {
glDisable(GL_CULL_FACE);
}
else{
@ -141,21 +141,25 @@ void ModelRendererGl::renderMesh(const Mesh *mesh){
}
//set color
if(renderColors){
if(renderColors) {
Vec4f color(mesh->getDiffuseColor(), mesh->getOpacity());
glColor4fv(color.ptr());
}
//texture state
const Texture2DGl *texture= static_cast<const Texture2DGl*>(mesh->getTexture(mtDiffuse));
if(texture != NULL && renderTextures){
if(texture != NULL && renderTextures) {
if(lastTexture != texture->getHandle()){
//assert(glIsTexture(texture->getHandle()));
if(glIsTexture(texture->getHandle()) == false) {
throw runtime_error("glIsTexture(texture->getHandle()) == false for texture: " + texture->getPath());
//throw runtime_error("glIsTexture(texture->getHandle()) == false for texture: " + texture->getPath());
if(glIsTexture(texture->getHandle()) == true) {
glBindTexture(GL_TEXTURE_2D, texture->getHandle());
lastTexture= texture->getHandle();
}
else {
glBindTexture(GL_TEXTURE_2D, 0);
lastTexture= 0;
}
glBindTexture(GL_TEXTURE_2D, texture->getHandle());
lastTexture= texture->getHandle();
}
}
else{
@ -163,7 +167,7 @@ void ModelRendererGl::renderMesh(const Mesh *mesh){
lastTexture= 0;
}
if(meshCallback!=NULL){
if(meshCallback != NULL) {
meshCallback->execute(mesh);
}
@ -178,7 +182,7 @@ void ModelRendererGl::renderMesh(const Mesh *mesh){
glVertexPointer(3, GL_FLOAT, 0, mesh->getInterpolationData()->getVertices());
//normals
if(renderNormals){
if(renderNormals) {
glEnableClientState(GL_NORMAL_ARRAY);
glNormalPointer(GL_FLOAT, 0, mesh->getInterpolationData()->getNormals());
}
@ -187,8 +191,8 @@ void ModelRendererGl::renderMesh(const Mesh *mesh){
}
//tex coords
if(renderTextures && mesh->getTexture(mtDiffuse)!=NULL ){
if(duplicateTexCoords){
if(renderTextures && mesh->getTexture(mtDiffuse)!=NULL ) {
if(duplicateTexCoords) {
glActiveTexture(GL_TEXTURE0 + secondaryTexCoordUnit);
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
glTexCoordPointer(2, GL_FLOAT, 0, mesh->getTexCoords());
@ -198,8 +202,8 @@ void ModelRendererGl::renderMesh(const Mesh *mesh){
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
glTexCoordPointer(2, GL_FLOAT, 0, mesh->getTexCoords());
}
else{
if(duplicateTexCoords){
else {
if(duplicateTexCoords) {
glActiveTexture(GL_TEXTURE0 + secondaryTexCoordUnit);
glDisableClientState(GL_TEXTURE_COORD_ARRAY);
}
@ -214,7 +218,7 @@ void ModelRendererGl::renderMesh(const Mesh *mesh){
assertGl();
}
void ModelRendererGl::renderMeshNormals(const Mesh *mesh){
void ModelRendererGl::renderMeshNormals(const Mesh *mesh) {
glBegin(GL_LINES);
for(unsigned int i= 0; i<mesh->getIndexCount(); ++i){