From Mike Weiblen, added support for samplers and mat4 to .osg

This commit is contained in:
Robert Osfield
2005-04-22 07:13:50 +00:00
parent 7f2ab883f5
commit 8b4f9dce60
3 changed files with 155 additions and 279 deletions

View File

@@ -11,7 +11,7 @@
*/
/* file: src/osg/Uniform.cpp
* author: Mike Weiblen 2005-04-07
* author: Mike Weiblen 2005-04-21
*/
#include <osg/Notify>
@@ -110,7 +110,7 @@ int Uniform::compareData(const Uniform& rhs) const
{
// caller must ensure that _type==rhs._type
switch( repType(getType()) )
switch( getGlApiType(getType()) )
{
case FLOAT:
if( _data.f1 < rhs._data.f1 ) return -1;
@@ -194,7 +194,7 @@ void Uniform::copyData(const Uniform& rhs)
// caller must ensure that _type==rhs._type
int i;
switch( repType(getType()) )
switch( getGlApiType(getType()) )
{
case FLOAT:
_data.f1 = rhs._data.f1;
@@ -259,7 +259,7 @@ bool Uniform::isCompatibleType( Type t ) const
{
if( (t==UNDEFINED) || (getType()==UNDEFINED) ) return false;
if( t == getType() ) return true;
if( repType(t) == repType(getType()) ) return true;
if( getGlApiType(t) == getGlApiType(getType()) ) return true;
osg::notify(osg::WARN)
<< "Cannot assign between Uniform types " << getTypename(t)
@@ -325,7 +325,7 @@ Uniform::Type Uniform::getTypeId( const std::string& tname )
return UNDEFINED;
}
Uniform::Type Uniform::repType( Type t )
Uniform::Type Uniform::getGlApiType( Type t )
{
switch( t )
{
@@ -686,7 +686,7 @@ bool Uniform::get( bool& b0, bool& b1, bool& b2, bool& b3 ) const
void Uniform::apply(const GL2Extensions* ext, GLint location) const
{
switch( _type )
switch( getGlApiType(getType()) )
{
case FLOAT:
ext->glUniform1f( location, _data.f1 );
@@ -733,7 +733,7 @@ void Uniform::apply(const GL2Extensions* ext, GLint location) const
break;
default:
osg::notify(osg::FATAL) << "how got here?" << std::endl;
osg::notify(osg::FATAL) << "how got here? " __FILE__ ":" << __LINE__ << std::endl;
break;
}
}

View File

@@ -6,6 +6,8 @@
#include "osgDB/Input"
#include "osgDB/Output"
#include "Matrix.h"
using namespace osg;
using namespace osgDB;
using namespace std;
@@ -39,16 +41,14 @@ bool Uniform_readLocalData(Object& obj, Input& fr)
iteratorAdvanced = true;
}
// TODO read uniform value based on type
if (fr[0].isWord())
{
uniform.setType( Uniform::getTypeId(fr[0].getStr()) );
fr+=1;
iteratorAdvanced = true;
uniform.setType( Uniform::getTypeId(fr[0].getStr()) );
fr+=1;
iteratorAdvanced = true;
}
switch(uniform.getType())
switch( Uniform::getGlApiType(uniform.getType()) )
{
case(osg::Uniform::FLOAT):
{
@@ -56,8 +56,8 @@ bool Uniform_readLocalData(Object& obj, Input& fr)
if (fr[0].getFloat(value))
{
uniform.set(value);
fr+=1;
iteratorAdvanced = true;
fr+=1;
iteratorAdvanced = true;
}
break;
}
@@ -67,8 +67,8 @@ bool Uniform_readLocalData(Object& obj, Input& fr)
if (fr[0].getFloat(value[0]) && fr[1].getFloat(value[1]))
{
uniform.set(value);
fr+=2;
iteratorAdvanced = true;
fr+=2;
iteratorAdvanced = true;
}
break;
}
@@ -78,8 +78,8 @@ bool Uniform_readLocalData(Object& obj, Input& fr)
if (fr[0].getFloat(value[0]) && fr[1].getFloat(value[1]) && fr[2].getFloat(value[2]))
{
uniform.set(value);
fr+=3;
iteratorAdvanced = true;
fr+=3;
iteratorAdvanced = true;
}
break;
}
@@ -89,8 +89,8 @@ bool Uniform_readLocalData(Object& obj, Input& fr)
if (fr[0].getFloat(value[0]) && fr[1].getFloat(value[1]) && fr[2].getFloat(value[2]) && fr[3].getFloat(value[3]))
{
uniform.set(value);
fr+=4;
iteratorAdvanced = true;
fr+=4;
iteratorAdvanced = true;
}
break;
}
@@ -100,8 +100,8 @@ bool Uniform_readLocalData(Object& obj, Input& fr)
if (fr[0].getInt(value))
{
uniform.set(value);
fr+=1;
iteratorAdvanced = true;
fr+=1;
iteratorAdvanced = true;
}
break;
}
@@ -111,8 +111,8 @@ bool Uniform_readLocalData(Object& obj, Input& fr)
if (fr[0].getInt(value[0]) && fr[1].getInt(value[1]))
{
uniform.set(value[0],value[1]);
fr+=2;
iteratorAdvanced = true;
fr+=2;
iteratorAdvanced = true;
}
break;
}
@@ -122,8 +122,8 @@ bool Uniform_readLocalData(Object& obj, Input& fr)
if (fr[0].getInt(value[0]) && fr[1].getInt(value[1]) && fr[2].getInt(value[2]))
{
uniform.set(value[0],value[1],value[2]);
fr+=3;
iteratorAdvanced = true;
fr+=3;
iteratorAdvanced = true;
}
break;
}
@@ -133,98 +133,29 @@ bool Uniform_readLocalData(Object& obj, Input& fr)
if (fr[0].getInt(value[0]) && fr[1].getInt(value[1]) && fr[2].getInt(value[2]) && fr[3].getInt(value[3]))
{
uniform.set(value[0],value[1],value[2],value[3]);
fr+=4;
iteratorAdvanced = true;
}
break;
}
case(osg::Uniform::BOOL):
{
int value;
if (fr[0].getInt(value))
{
uniform.set(value!=0 ? true:false);
fr+=1;
iteratorAdvanced = true;
}
break;
}
case(osg::Uniform::BOOL_VEC2):
{
int value[2];
if (fr[0].getInt(value[0]) && fr[1].getInt(value[1]))
{
uniform.set(value[0]!=0 ? true:false, value[1]!=0 ? true:false);
fr+=2;
iteratorAdvanced = true;
}
break;
}
case(osg::Uniform::BOOL_VEC3):
{
int value[3];
if (fr[0].getInt(value[0]) && fr[1].getInt(value[1]) && fr[2].getInt(value[2]))
{
uniform.set(value[0]!=0 ? true:false, value[1]!=0 ? true:false, value[2]!=0 ? true:false);
fr+=3;
iteratorAdvanced = true;
}
break;
}
case(osg::Uniform::BOOL_VEC4):
{
int value[4];
if (fr[0].getInt(value[0]) && fr[1].getInt(value[1]) && fr[2].getInt(value[2]) && fr[3].getInt(value[3]))
{
uniform.set(value[0]!=0 ? true:false, value[1]!=0 ? true:false, value[2]!=0 ? true:false, value[3]!=0 ? true:false);
fr+=4;
iteratorAdvanced = true;
fr+=4;
iteratorAdvanced = true;
}
break;
}
case(osg::Uniform::FLOAT_MAT2):
{
osg::notify(osg::WARN)<<"Warning : type not supported for reading."<<std::endl;
osg::notify(osg::WARN)<<"Warning : type mat2 not supported for reading."<<std::endl;
break;
}
case(osg::Uniform::FLOAT_MAT3):
{
osg::notify(osg::WARN)<<"Warning : type not supported for reading."<<std::endl;
osg::notify(osg::WARN)<<"Warning : type mat3 not supported for reading."<<std::endl;
break;
}
case(osg::Uniform::FLOAT_MAT4):
{
osg::notify(osg::WARN)<<"Warning : type not supported for reading."<<std::endl;
break;
}
case(osg::Uniform::SAMPLER_1D):
{
osg::notify(osg::WARN)<<"Warning : type not supported for reading."<<std::endl;
break;
}
case(osg::Uniform::SAMPLER_2D):
{
osg::notify(osg::WARN)<<"Warning : type not supported for reading."<<std::endl;
break;
}
case(osg::Uniform::SAMPLER_3D):
{
osg::notify(osg::WARN)<<"Warning : type not supported for reading."<<std::endl;
break;
}
case(osg::Uniform::SAMPLER_CUBE):
{
osg::notify(osg::WARN)<<"Warning : type not supported for reading."<<std::endl;
break;
}
case(osg::Uniform::SAMPLER_1D_SHADOW):
{
osg::notify(osg::WARN)<<"Warning : type not supported for reading."<<std::endl;
break;
}
case(osg::Uniform::SAMPLER_2D_SHADOW):
{
osg::notify(osg::WARN)<<"Warning : type not supported for reading."<<std::endl;
Matrix value;
if( readMatrix(value,fr) )
{
uniform.set(value);
iteratorAdvanced = true;
}
break;
}
case(osg::Uniform::UNDEFINED):
@@ -246,7 +177,7 @@ bool Uniform_writeLocalData(const Object& obj,Output& fw)
fw.indent() << Uniform::getTypename( uniform.getType() ) << " ";
switch(uniform.getType())
switch( Uniform::getGlApiType(uniform.getType()) )
{
case(osg::Uniform::FLOAT):
{
@@ -304,77 +235,21 @@ bool Uniform_writeLocalData(const Object& obj,Output& fw)
fw << value[0]<<" "<<value[1]<<" "<<value[2]<<" "<<value[3];
break;
}
case(osg::Uniform::BOOL):
{
bool value = 0;
uniform.get(value);
fw << value;
break;
}
case(osg::Uniform::BOOL_VEC2):
{
bool value[2];
uniform.get(value[0],value[1]);
fw << value[0]<<" "<<value[1];
break;
}
case(osg::Uniform::BOOL_VEC3):
{
bool value[3];
uniform.get(value[0],value[1],value[2]);
fw << value[0]<<" "<<value[1]<<" "<<value[2];
break;
}
case(osg::Uniform::BOOL_VEC4):
{
bool value[4];
uniform.get(value[0],value[1],value[2],value[3]);
fw << value[0]<<" "<<value[1]<<" "<<value[2]<<" "<<value[3];
break;
}
case(osg::Uniform::FLOAT_MAT2):
{
osg::notify(osg::WARN)<<"Warning : type not supported for writing."<<std::endl;
osg::notify(osg::WARN)<<"Warning : type mat2 not supported for writing."<<std::endl;
break;
}
case(osg::Uniform::FLOAT_MAT3):
{
osg::notify(osg::WARN)<<"Warning : type not supported for writing."<<std::endl;
osg::notify(osg::WARN)<<"Warning : type mat3 not supported for writing."<<std::endl;
break;
}
case(osg::Uniform::FLOAT_MAT4):
{
osg::notify(osg::WARN)<<"Warning : type not supported for writing."<<std::endl;
break;
}
case(osg::Uniform::SAMPLER_1D):
{
osg::notify(osg::WARN)<<"Warning : type not supported for writing."<<std::endl;
break;
}
case(osg::Uniform::SAMPLER_2D):
{
osg::notify(osg::WARN)<<"Warning : type not supported for writing."<<std::endl;
break;
}
case(osg::Uniform::SAMPLER_3D):
{
osg::notify(osg::WARN)<<"Warning : type not supported for writing."<<std::endl;
break;
}
case(osg::Uniform::SAMPLER_CUBE):
{
osg::notify(osg::WARN)<<"Warning : type not supported for writing."<<std::endl;
break;
}
case(osg::Uniform::SAMPLER_1D_SHADOW):
{
osg::notify(osg::WARN)<<"Warning : type not supported for writing."<<std::endl;
break;
}
case(osg::Uniform::SAMPLER_2D_SHADOW):
{
osg::notify(osg::WARN)<<"Warning : type not supported for writing."<<std::endl;
Matrix value;
uniform.get(value);
writeMatrix(value,fw);
break;
}
case(osg::Uniform::UNDEFINED):