- attempt to better handler tomreyn's fuzzer.
This commit is contained in:
parent
26a382bd64
commit
6bfc4d7c2e
|
@ -19,7 +19,7 @@
|
||||||
|
|
||||||
using namespace Shared::Platform;
|
using namespace Shared::Platform;
|
||||||
|
|
||||||
namespace Shared{ namespace Graphics{ namespace Gl{
|
namespace Shared { namespace Graphics { namespace Gl {
|
||||||
|
|
||||||
// =====================================================
|
// =====================================================
|
||||||
// class MyClass
|
// class MyClass
|
||||||
|
@ -27,15 +27,15 @@ namespace Shared{ namespace Graphics{ namespace Gl{
|
||||||
|
|
||||||
// ===================== PUBLIC ========================
|
// ===================== PUBLIC ========================
|
||||||
|
|
||||||
ModelRendererGl::ModelRendererGl(){
|
ModelRendererGl::ModelRendererGl() {
|
||||||
rendering= false;
|
rendering= false;
|
||||||
duplicateTexCoords= false;
|
duplicateTexCoords= false;
|
||||||
secondaryTexCoordUnit= 1;
|
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
|
//assertions
|
||||||
assert(!rendering);
|
assert(rendering == false);
|
||||||
assertGl();
|
assertGl();
|
||||||
|
|
||||||
this->renderTextures= renderTextures;
|
this->renderTextures= renderTextures;
|
||||||
|
@ -81,7 +81,7 @@ void ModelRendererGl::begin(bool renderNormals, bool renderTextures, bool render
|
||||||
assertGl();
|
assertGl();
|
||||||
}
|
}
|
||||||
|
|
||||||
void ModelRendererGl::end(){
|
void ModelRendererGl::end() {
|
||||||
//assertions
|
//assertions
|
||||||
assert(rendering);
|
assert(rendering);
|
||||||
assertGl();
|
assertGl();
|
||||||
|
@ -97,13 +97,13 @@ void ModelRendererGl::end(){
|
||||||
assertGl();
|
assertGl();
|
||||||
}
|
}
|
||||||
|
|
||||||
void ModelRendererGl::render(const Model *model){
|
void ModelRendererGl::render(const Model *model) {
|
||||||
//assertions
|
//assertions
|
||||||
assert(rendering);
|
assert(rendering);
|
||||||
assertGl();
|
assertGl();
|
||||||
|
|
||||||
//render every mesh
|
//render every mesh
|
||||||
for(uint32 i=0; i<model->getMeshCount(); ++i){
|
for(uint32 i=0; i<model->getMeshCount(); ++i) {
|
||||||
renderMesh(model->getMesh(i));
|
renderMesh(model->getMesh(i));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -111,13 +111,13 @@ void ModelRendererGl::render(const Model *model){
|
||||||
assertGl();
|
assertGl();
|
||||||
}
|
}
|
||||||
|
|
||||||
void ModelRendererGl::renderNormalsOnly(const Model *model){
|
void ModelRendererGl::renderNormalsOnly(const Model *model) {
|
||||||
//assertions
|
//assertions
|
||||||
assert(rendering);
|
assert(rendering);
|
||||||
assertGl();
|
assertGl();
|
||||||
|
|
||||||
//render every mesh
|
//render every mesh
|
||||||
for(uint32 i=0; i<model->getMeshCount(); ++i){
|
for(uint32 i=0; i<model->getMeshCount(); ++i) {
|
||||||
renderMeshNormals(model->getMesh(i));
|
renderMeshNormals(model->getMesh(i));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -127,13 +127,13 @@ void ModelRendererGl::renderNormalsOnly(const Model *model){
|
||||||
|
|
||||||
// ===================== PRIVATE =======================
|
// ===================== PRIVATE =======================
|
||||||
|
|
||||||
void ModelRendererGl::renderMesh(const Mesh *mesh){
|
void ModelRendererGl::renderMesh(const Mesh *mesh) {
|
||||||
|
|
||||||
//assertions
|
//assertions
|
||||||
assertGl();
|
assertGl();
|
||||||
|
|
||||||
//set cull face
|
//set cull face
|
||||||
if(mesh->getTwoSided()){
|
if(mesh->getTwoSided()) {
|
||||||
glDisable(GL_CULL_FACE);
|
glDisable(GL_CULL_FACE);
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
|
@ -141,21 +141,25 @@ void ModelRendererGl::renderMesh(const Mesh *mesh){
|
||||||
}
|
}
|
||||||
|
|
||||||
//set color
|
//set color
|
||||||
if(renderColors){
|
if(renderColors) {
|
||||||
Vec4f color(mesh->getDiffuseColor(), mesh->getOpacity());
|
Vec4f color(mesh->getDiffuseColor(), mesh->getOpacity());
|
||||||
glColor4fv(color.ptr());
|
glColor4fv(color.ptr());
|
||||||
}
|
}
|
||||||
|
|
||||||
//texture state
|
//texture state
|
||||||
const Texture2DGl *texture= static_cast<const Texture2DGl*>(mesh->getTexture(mtDiffuse));
|
const Texture2DGl *texture= static_cast<const Texture2DGl*>(mesh->getTexture(mtDiffuse));
|
||||||
if(texture != NULL && renderTextures){
|
if(texture != NULL && renderTextures) {
|
||||||
if(lastTexture != texture->getHandle()){
|
if(lastTexture != texture->getHandle()){
|
||||||
//assert(glIsTexture(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{
|
else{
|
||||||
|
@ -163,7 +167,7 @@ void ModelRendererGl::renderMesh(const Mesh *mesh){
|
||||||
lastTexture= 0;
|
lastTexture= 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(meshCallback!=NULL){
|
if(meshCallback != NULL) {
|
||||||
meshCallback->execute(mesh);
|
meshCallback->execute(mesh);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -178,7 +182,7 @@ void ModelRendererGl::renderMesh(const Mesh *mesh){
|
||||||
glVertexPointer(3, GL_FLOAT, 0, mesh->getInterpolationData()->getVertices());
|
glVertexPointer(3, GL_FLOAT, 0, mesh->getInterpolationData()->getVertices());
|
||||||
|
|
||||||
//normals
|
//normals
|
||||||
if(renderNormals){
|
if(renderNormals) {
|
||||||
glEnableClientState(GL_NORMAL_ARRAY);
|
glEnableClientState(GL_NORMAL_ARRAY);
|
||||||
glNormalPointer(GL_FLOAT, 0, mesh->getInterpolationData()->getNormals());
|
glNormalPointer(GL_FLOAT, 0, mesh->getInterpolationData()->getNormals());
|
||||||
}
|
}
|
||||||
|
@ -187,8 +191,8 @@ void ModelRendererGl::renderMesh(const Mesh *mesh){
|
||||||
}
|
}
|
||||||
|
|
||||||
//tex coords
|
//tex coords
|
||||||
if(renderTextures && mesh->getTexture(mtDiffuse)!=NULL ){
|
if(renderTextures && mesh->getTexture(mtDiffuse)!=NULL ) {
|
||||||
if(duplicateTexCoords){
|
if(duplicateTexCoords) {
|
||||||
glActiveTexture(GL_TEXTURE0 + secondaryTexCoordUnit);
|
glActiveTexture(GL_TEXTURE0 + secondaryTexCoordUnit);
|
||||||
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
|
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
|
||||||
glTexCoordPointer(2, GL_FLOAT, 0, mesh->getTexCoords());
|
glTexCoordPointer(2, GL_FLOAT, 0, mesh->getTexCoords());
|
||||||
|
@ -198,8 +202,8 @@ void ModelRendererGl::renderMesh(const Mesh *mesh){
|
||||||
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
|
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
|
||||||
glTexCoordPointer(2, GL_FLOAT, 0, mesh->getTexCoords());
|
glTexCoordPointer(2, GL_FLOAT, 0, mesh->getTexCoords());
|
||||||
}
|
}
|
||||||
else{
|
else {
|
||||||
if(duplicateTexCoords){
|
if(duplicateTexCoords) {
|
||||||
glActiveTexture(GL_TEXTURE0 + secondaryTexCoordUnit);
|
glActiveTexture(GL_TEXTURE0 + secondaryTexCoordUnit);
|
||||||
glDisableClientState(GL_TEXTURE_COORD_ARRAY);
|
glDisableClientState(GL_TEXTURE_COORD_ARRAY);
|
||||||
}
|
}
|
||||||
|
@ -214,7 +218,7 @@ void ModelRendererGl::renderMesh(const Mesh *mesh){
|
||||||
assertGl();
|
assertGl();
|
||||||
}
|
}
|
||||||
|
|
||||||
void ModelRendererGl::renderMeshNormals(const Mesh *mesh){
|
void ModelRendererGl::renderMeshNormals(const Mesh *mesh) {
|
||||||
|
|
||||||
glBegin(GL_LINES);
|
glBegin(GL_LINES);
|
||||||
for(unsigned int i= 0; i<mesh->getIndexCount(); ++i){
|
for(unsigned int i= 0; i<mesh->getIndexCount(); ++i){
|
||||||
|
|
Loading…
Reference in New Issue
Block a user