Fixed the osg::Light so that it requires the user to explicitly define which

OpenGL light is being operated on, and also now relies upong the standard
osg::State handling of OpenGL modes to switch on the appropriate lights.

The previous static counter mechansim for the light number was causing a
redundent light to be created when the osg plugin created the first osg::Light
to use a prototype for other osg::Light's to be cloned from in the
.osg plugin execution.

The static count mechanism also prevent the lights modes being controlled
independantly from the setting of the light paramters themselves.  This
meant that a light once created was global, and couldn't be turned off
locally via the OSG's support for OpenGL mode enabling/disabling.  This
has been overcome with the new implementation, the user has complete
flexiblity of when and where to use the different lights at their
disposal.
This commit is contained in:
Robert Osfield
2001-12-24 21:34:40 +00:00
parent a6d329b812
commit 98c8447ae9
5 changed files with 43 additions and 41 deletions

View File

@@ -44,6 +44,7 @@ public:
opacity=1; specular=0; specexp=0; fname="";TextureWidth=1; TextureHeight=1;
ctx=NULL; tx=NULL; id=0; dstate=NULL;colour[0]=colour[1]=colour[2]=colour[3]=1;
bright=halfIn=halfOut=falloff=0;atyp=NONE;
_lightnum=0;
}
~dwmaterial() { }
void settexture() {
@@ -135,14 +136,15 @@ public:
fname= (buff+13);
fname+= ".tga";
}
LightSource *makeLight(const Vec4 pos) {
LightSource *makeLight(const Vec4 pos)
{
Light *lt= new Light;
Vec4 cdef;
cdef[0]=cdef[1]=cdef[2]=0.0f; cdef[3]=0.0f;
lt->setLightNum(_lightnum++);
lt->setSpecular(colour*bright/2.0f);
lt->setDiffuse(colour*bright/4.0f);
lt->setAmbient(cdef);
lt->on();
if (atyp==NONE) ;
else if (atyp==INVERSE_DIST) {
lt->setLinearAttenuation(1.0f);
@@ -174,6 +176,7 @@ private:
float bright,halfIn,halfOut,falloff; // light brightness
Image *ctx;
Texture *tx;
int _lightnum;
StateSet *dstate; // used to represent the dw material in OSG
};
// structure to use as data for tesselation

View File

@@ -32,6 +32,16 @@ bool Light_readLocalData(Object& obj, Input& fr)
Light& light = static_cast<Light&>(obj);
if (fr[0].matchWord("light_num"))
{
int lightnum=0;
if (fr[1].getInt(lightnum))
{
light.setLightNum(lightnum);
fr += 2;
iteratorAdvanced = true;
}
}
#define ReadVec4(A,B) { \
if (fr[0].matchWord(B) && \
@@ -96,6 +106,8 @@ bool Light_writeLocalData(const Object& obj,Output& fw)
{
const Light& light = static_cast<const Light&>(obj);
fw.indent() << "light_num " << light.getLightNum() << std::endl;
// Vec4's
fw.indent() << "ambient " << light.getAmbient() << std::endl;
fw.indent() << "diffuse " << light.getDiffuse() << std::endl;