1
0
mirror of https://git.dev.opencascade.org/repos/occt.git synced 2025-04-10 18:51:21 +03:00

0024310: TKOpenGl - GLSL compatibility issues

Lights defintion clean up:
- remove duplicated enumeration TLightType (equals to Visual3d_TypeOfLightSource)
- remove unused fields from Graphic3d_CLight
- OpenGl_Light, reuse Graphic3d_CLight definition

Phong GLSL program:
- move out cumulative ambient light intencity from limited list of lights
- compatibility issues, replace array of structures (light sources, materials, clipping planes) with arrays of primitive types

New Draw Harness command vlight to alter light sources definition.

OpenGl_ShaderProgram::Initialize() - add missing Linker log
This commit is contained in:
kgv 2013-11-04 04:42:44 +04:00 committed by abv
parent e91d202a72
commit 1238134135
29 changed files with 1453 additions and 1757 deletions

View File

@ -15,26 +15,66 @@
// purpose or non-infringement. Please see the License for the specific terms // purpose or non-infringement. Please see the License for the specific terms
// and conditions governing the rights and limitations under the License. // and conditions governing the rights and limitations under the License.
/*============================================================================*/
/*==== Titre: Graphic3d_CLight.hxx */
/*==== Role : The header file of primitive type "CLight" from Graphic3d */
/*==== */
/*==== Implementation: This is a primitive type implemented with typedef */
/*============================================================================*/
#ifndef _Graphic3d_CLight_HeaderFile #ifndef _Graphic3d_CLight_HeaderFile
#define _Graphic3d_CLight_HeaderFile #define _Graphic3d_CLight_HeaderFile
#include <InterfaceGraphic_Graphic3d.hxx> #include <InterfaceGraphic_Graphic3d.hxx>
#include <InterfaceGraphic_Visual3d.hxx> #include <InterfaceGraphic_Visual3d.hxx>
typedef CALL_DEF_LIGHT Graphic3d_CLight; #include <Graphic3d_Vec.hxx>
#if defined(__cplusplus) || defined(c_plusplus)
/*==== Definition de Type ====================================================*/
#include <Standard_Type.hxx> #include <Standard_Type.hxx>
const Handle(Standard_Type)& TYPE(Graphic3d_CLight);
/*============================================================================*/
#endif //! Light definition
#endif /*Graphic3d_CLight_HeaderFile*/ struct Graphic3d_CLight
{
public:
Graphic3d_Vec4 Color; //!< light color
Graphic3d_Vec4 Position; //!< light position
Graphic3d_Vec4 Direction; //!< direction of directional/spot light
Graphic3d_Vec4 Params; //!< packed light parameters
Standard_Integer Type; //!< Visual3d_TypeOfLightSource enumeration
Standard_Boolean IsHeadlight; //!< flag to mark head light
//! Const attenuation factor of positional light source
Standard_ShortReal ConstAttenuation() const { return Params.x(); }
//! Linear attenuation factor of positional light source
Standard_ShortReal LinearAttenuation() const { return Params.y(); }
//! Const, Linear attenuation factors of positional light source
Graphic3d_Vec2 Attenuation() const { return Params.xy(); }
//! Angle in radians of the cone created by the spot
Standard_ShortReal Angle() const { return Params.z(); }
//! Intensity distribution of the spot light, with 0..1 range.
Standard_ShortReal Concentration() const { return Params.w(); }
Standard_ShortReal& ChangeConstAttenuation() { return Params.x(); }
Standard_ShortReal& ChangeLinearAttenuation() { return Params.y(); }
Graphic3d_Vec2& ChangeAttenuation() { return Params.xy(); }
Standard_ShortReal& ChangeAngle() { return Params.z(); }
Standard_ShortReal& ChangeConcentration() { return Params.w(); }
public:
//! Empty constructor
Graphic3d_CLight()
: Color (1.0f, 1.0f, 1.0f, 1.0f),
Position (0.0f, 0.0f, 0.0f, 1.0f),
Direction (0.0f, 0.0f, 0.0f, 0.0f),
Params (0.0f, 0.0f, 0.0f, 0.0f),
Type (0),
IsHeadlight (Standard_False)
{
//
}
public:
DEFINE_STANDARD_ALLOC
};
#endif // Graphic3d_CLight_HeaderFile

View File

@ -21,7 +21,7 @@
#include <InterfaceGraphic_Graphic3d.hxx> #include <InterfaceGraphic_Graphic3d.hxx>
#include <InterfaceGraphic_Visual3d.hxx> #include <InterfaceGraphic_Visual3d.hxx>
#include <Handle_Graphic3d_TextureEnv.hxx> #include <Handle_Graphic3d_TextureEnv.hxx>
#include <Standard_Type.hxx> #include <Graphic3d_CLight.hxx>
#include <Graphic3d_SetOfHClipPlane.hxx> #include <Graphic3d_SetOfHClipPlane.hxx>
class CALL_DEF_VIEWCONTEXT class CALL_DEF_VIEWCONTEXT
@ -69,7 +69,7 @@ public:
int Visualization; int Visualization;
int NbActiveLight; int NbActiveLight;
CALL_DEF_LIGHT* ActiveLight; Graphic3d_CLight* ActiveLight;
Handle(Graphic3d_TextureEnv) TextureEnv; Handle(Graphic3d_TextureEnv) TextureEnv;
int SurfaceDetail; int SurfaceDetail;

View File

@ -941,16 +941,6 @@ is
---Purpose: Get Z layer ID of structure. If the structure doesn't ---Purpose: Get Z layer ID of structure. If the structure doesn't
-- exists in graphic driver, the method returns -1. -- exists in graphic driver, the method returns -1.
--------------------------
-- Category: Class methods
--------------------------
Light ( myclass;
ACLight : CLight from Graphic3d;
Update : Boolean from Standard )
returns Integer from Standard;
---Purpose: call_togl_light
----------------------------- -----------------------------
-- Category: Internal methods -- Category: Internal methods
----------------------------- -----------------------------

View File

@ -55,18 +55,6 @@ Graphic3d_GraphicDriver::Graphic3d_GraphicDriver (const Standard_CString AShrNam
} }
//-Methods, in order
Standard_Integer Graphic3d_GraphicDriver::Light (const Graphic3d_CLight& ACLight, const Standard_Boolean Update) {
static Standard_Integer NbLights = 1;
Standard_Boolean Result;
Result = Update ? ACLight.LightId : NbLights++;
return Result;
}
//-Internal methods, in order //-Internal methods, in order
void Graphic3d_GraphicDriver::PrintBoolean (const Standard_CString AComment, const Standard_Boolean AValue) const { void Graphic3d_GraphicDriver::PrintBoolean (const Standard_CString AComment, const Standard_Boolean AValue) const {
@ -87,12 +75,12 @@ void Graphic3d_GraphicDriver::PrintCGroup (const Graphic3d_CGroup& ACGroup, cons
} }
void Graphic3d_GraphicDriver::PrintCLight (const Graphic3d_CLight& ACLight, const Standard_Integer AField) const { void Graphic3d_GraphicDriver::PrintCLight (const Graphic3d_CLight& theCLight,
const Standard_Integer theField) const
if (AField) { {
cout << "\tws id " << ACLight.WsId << ", " if (theField)
<< "view id " << ACLight.ViewId << "\n"; {
switch (ACLight.LightType) { switch (theCLight.Type) {
case 0 : case 0 :
cout << "\tlight type : ambient\n"; cout << "\tlight type : ambient\n";
break; break;
@ -111,7 +99,6 @@ void Graphic3d_GraphicDriver::PrintCLight (const Graphic3d_CLight& ACLight, cons
} }
cout << flush; cout << flush;
} }
} }
void Graphic3d_GraphicDriver::PrintCPick (const Graphic3d_CPick& ACPick, const Standard_Integer AField) const { void Graphic3d_GraphicDriver::PrintCPick (const Graphic3d_CPick& ACPick, const Standard_Integer AField) const {

View File

@ -35,37 +35,6 @@ typedef struct {
} CALL_DEF_VERTEX; } CALL_DEF_VERTEX;
/* SOURCE LUMINEUSE */
typedef struct {
int WsId;
int ViewId;
int LightId;
int Active;
int LightType;
int Headlight;
CALL_DEF_COLOR Color;
CALL_DEF_VERTEX Position;
CALL_DEF_VERTEX Direction;
float Concentration;
float Attenuation[2];
float Angle;
} CALL_DEF_LIGHT;
/* ORIENTATION */ /* ORIENTATION */
typedef struct { typedef struct {

View File

@ -48,14 +48,6 @@ struct TEL_COLOUR
}; };
typedef TEL_COLOUR* tel_colour; typedef TEL_COLOUR* tel_colour;
typedef enum
{
TLightAmbient,
TLightDirectional,
TLightPositional,
TLightSpot
} TLightType;
typedef enum typedef enum
{ {
TelCullNone, TelCullNone,

View File

@ -215,6 +215,12 @@ public:
return aSumm += theRight; return aSumm += theRight;
} }
//! Unary -.
NCollection_Vec4 operator-() const
{
return NCollection_Vec4 (-x(), -y(), -z(), -w());
}
//! Compute per-component subtraction. //! Compute per-component subtraction.
NCollection_Vec4& operator-= (const NCollection_Vec4& theDec) NCollection_Vec4& operator-= (const NCollection_Vec4& theDec)
{ {

View File

@ -17,29 +17,16 @@
// purpose or non-infringement. Please see the License for the specific terms // purpose or non-infringement. Please see the License for the specific terms
// and conditions governing the rights and limitations under the License. // and conditions governing the rights and limitations under the License.
#ifndef OpenGl_Light_Header #ifndef OpenGl_Light_Header
#define OpenGl_Light_Header #define OpenGl_Light_Header
#include <Graphic3d_CLight.hxx>
#include <Visual3d_TypeOfLightSource.hxx>
#include <NCollection_List.hxx> #include <NCollection_List.hxx>
#include <InterfaceGraphic_telem.hxx> #define OpenGLMaxLights 8
#define OpenGLMaxLights 8
struct OpenGl_Light
{
TLightType type;
int HeadLight;
TEL_COLOUR col;
Tfloat pos[3];
Tfloat dir[3];
Tfloat shine;
Tfloat atten[2];
Tfloat angle;
DEFINE_STANDARD_ALLOC
};
typedef Graphic3d_CLight OpenGl_Light;
typedef NCollection_List<OpenGl_Light> OpenGl_ListOfLight; typedef NCollection_List<OpenGl_Light> OpenGl_ListOfLight;
#endif //OpenGl_Light_Header #endif // OpenGl_Light_Header

View File

@ -255,89 +255,75 @@ const OpenGl_WorldViewState& OpenGl_ShaderManager::WorldViewState() const
// ======================================================================= // =======================================================================
void OpenGl_ShaderManager::PushLightSourceState (const Handle(OpenGl_ShaderProgram)& theProgram) const void OpenGl_ShaderManager::PushLightSourceState (const Handle(OpenGl_ShaderProgram)& theProgram) const
{ {
if (myLightSourceState.Index() == theProgram->ActiveState (OpenGl_LIGHT_SOURCES_STATE)) if (myLightSourceState.Index() == theProgram->ActiveState (OpenGl_LIGHT_SOURCES_STATE)
|| !theProgram->IsValid())
{ {
return; return;
} }
theProgram->SetUniform (myContext, theProgram->GetStateLocation (
OpenGl_OCC_LIGHT_SOURCE_COUNT), myLightSourceState.LightSources()->Size());
OpenGl_ListOfLight::Iterator anIter (*myLightSourceState.LightSources()); const GLint aTypesLoc = theProgram->GetStateLocation (OpenGl_OCC_LIGHT_SOURCE_TYPES);
for (unsigned int anIndex = 0; anIter.More(); anIter.Next()) const GLint aParamsLoc = theProgram->GetStateLocation (OpenGl_OCC_LIGHT_SOURCE_PARAMS);
const Standard_Integer aLightsDefNb = Min (myLightSourceState.LightSources()->Size(), OpenGLMaxLights);
if (aLightsDefNb < 1)
{ {
if (anIndex >= OpenGLMaxLights)
{
break;
}
const OpenGl_Light& aLight = anIter.Value();
if (aLight.type == TLightAmbient)
{
OpenGl_Vec3 anAmbient (aLight.col.rgb[0],
aLight.col.rgb[1],
aLight.col.rgb[2]);
theProgram->SetUniform (myContext,
theProgram->GetStateLocation (OpenGl_OCC_LIGHT_SOURCE_0_AMBIENT + anIndex), anAmbient);
anIter.Next();
if (!anIter.More())
{
theProgram->SetUniform (myContext,
theProgram->GetStateLocation (OpenGl_OCC_LIGHT_SOURCE_0_TYPE + anIndex), int (aLight.type));
break;
}
}
OpenGl_Vec3 aDiffuse (aLight.col.rgb[0],
aLight.col.rgb[1],
aLight.col.rgb[2]);
OpenGl_Vec3 aPosition (aLight.type == TLightDirectional ? -aLight.dir[0] : aLight.pos[0],
aLight.type == TLightDirectional ? -aLight.dir[1] : aLight.pos[1],
aLight.type == TLightDirectional ? -aLight.dir[2] : aLight.pos[2]);
theProgram->SetUniform (myContext, theProgram->SetUniform (myContext,
theProgram->GetStateLocation (OpenGl_OCC_LIGHT_SOURCE_0_TYPE + anIndex), int (aLight.type)); theProgram->GetStateLocation (OpenGl_OCC_LIGHT_SOURCE_COUNT),
0);
theProgram->SetUniform (myContext, theProgram->SetUniform (myContext,
theProgram->GetStateLocation (OpenGl_OCC_LIGHT_SOURCE_0_HEAD + anIndex), aLight.HeadLight); theProgram->GetStateLocation (OpenGl_OCC_LIGHT_AMBIENT),
OpenGl_Vec4 (0.0f, 0.0f, 0.0f, 0.0f));
theProgram->SetUniform (myContext, theProgram->UpdateState (OpenGl_LIGHT_SOURCES_STATE, myLightSourceState.Index());
theProgram->GetStateLocation (OpenGl_OCC_LIGHT_SOURCE_0_DIFFUSE + anIndex), aDiffuse); return;
theProgram->SetUniform (myContext,
theProgram->GetStateLocation (OpenGl_OCC_LIGHT_SOURCE_0_SPECULAR + anIndex), aDiffuse);
theProgram->SetUniform (myContext,
theProgram->GetStateLocation (OpenGl_OCC_LIGHT_SOURCE_0_POSITION + anIndex), aPosition);
theProgram->SetUniform (myContext,
theProgram->GetStateLocation (OpenGl_OCC_LIGHT_SOURCE_0_CONST_ATTENUATION + anIndex), aLight.atten[0]);
theProgram->SetUniform (myContext,
theProgram->GetStateLocation (OpenGl_OCC_LIGHT_SOURCE_0_LINEAR_ATTENUATION + anIndex), aLight.atten[1]);
if (aLight.type == TLightSpot)
{
OpenGl_Vec3 aDirection (aLight.dir[0],
aLight.dir[1],
aLight.dir[2]);
theProgram->SetUniform (myContext,
theProgram->GetStateLocation (OpenGl_OCC_LIGHT_SOURCE_0_SPOT_CUTOFF + anIndex), aLight.angle);
theProgram->SetUniform (myContext,
theProgram->GetStateLocation (OpenGl_OCC_LIGHT_SOURCE_0_SPOT_EXPONENT + anIndex), aLight.shine);
theProgram->SetUniform (myContext,
theProgram->GetStateLocation (OpenGl_OCC_LIGHT_SOURCE_0_SPOT_DIRECTION + anIndex), aDirection);
}
++anIndex;
} }
OpenGl_Vec2i* aTypesArray = new OpenGl_Vec2i[aLightsDefNb];
OpenGl_Vec4* aParamsArray = new OpenGl_Vec4 [aLightsDefNb * 4];
OpenGl_Vec4 anAmbient (0.0f, 0.0f, 0.0f, 0.0f);
Standard_Integer aLightsNb = 0;
for (OpenGl_ListOfLight::Iterator anIter (*myLightSourceState.LightSources()); anIter.More(); anIter.Next())
{
const OpenGl_Light& aLight = anIter.Value();
if (aLight.Type == Visual3d_TOLS_AMBIENT)
{
anAmbient += aLight.Color;
continue;
}
else if (aLightsNb >= OpenGLMaxLights)
{
continue;
}
aTypesArray[aLightsNb].x() = aLight.Type;
aTypesArray[aLightsNb].y() = aLight.IsHeadlight;
aParamsArray[aLightsNb * 4 + 0] = aLight.Color;
aParamsArray[aLightsNb * 4 + 1] = aLight.Type == Visual3d_TOLS_DIRECTIONAL
? -aLight.Direction
: aLight.Position;
if (aLight.Type == Visual3d_TOLS_SPOT)
{
aParamsArray[aLightsNb * 4 + 2] = aLight.Direction;
}
aParamsArray[aLightsNb * 4 + 3] = aLight.Params;
++aLightsNb;
}
theProgram->SetUniform (myContext,
theProgram->GetStateLocation (OpenGl_OCC_LIGHT_SOURCE_COUNT),
aLightsNb);
theProgram->SetUniform (myContext,
theProgram->GetStateLocation (OpenGl_OCC_LIGHT_AMBIENT),
anAmbient);
if (aLightsNb > 0)
{
myContext->core20->glUniform2iv (aTypesLoc, aLightsNb, aTypesArray [0].GetData());
myContext->core20->glUniform4fv (aParamsLoc, aLightsNb * 4, aParamsArray[0].GetData());
}
delete[] aTypesArray;
delete[] aParamsArray;
theProgram->UpdateState (OpenGl_LIGHT_SOURCES_STATE, myLightSourceState.Index()); theProgram->UpdateState (OpenGl_LIGHT_SOURCES_STATE, myLightSourceState.Index());
} }
@ -472,8 +458,18 @@ void OpenGl_ShaderManager::PushClippingState (const Handle(OpenGl_ShaderProgram)
return; return;
} }
Graphic3d_SetOfHClipPlane::Iterator anIter (myContext->Clipping().Planes()); theProgram->UpdateState (OpenGl_CLIP_PLANES_STATE, myClippingState.Index());
for (GLuint anIndex = 0; anIter.More(); anIter.Next()) const GLint aLocEquations = theProgram->GetStateLocation (OpenGl_OCC_CLIP_PLANE_EQUATIONS);
const GLint aLocSpaces = theProgram->GetStateLocation (OpenGl_OCC_CLIP_PLANE_SPACES);
if (aLocEquations == OpenGl_ShaderProgram::INVALID_LOCATION
&& aLocSpaces == OpenGl_ShaderProgram::INVALID_LOCATION)
{
return;
}
GLuint aPlanesNb = 0;
for (Graphic3d_SetOfHClipPlane::Iterator anIter (myContext->Clipping().Planes());
anIter.More(); anIter.Next())
{ {
const Handle(Graphic3d_ClipPlane)& aPlane = anIter.Value(); const Handle(Graphic3d_ClipPlane)& aPlane = anIter.Value();
if (!myContext->Clipping().IsEnabled (aPlane)) if (!myContext->Clipping().IsEnabled (aPlane))
@ -481,23 +477,37 @@ void OpenGl_ShaderManager::PushClippingState (const Handle(OpenGl_ShaderProgram)
continue; continue;
} }
GLint aLocation = theProgram->GetStateLocation (OpenGl_OCC_CLIP_PLANE_0_EQUATION + anIndex); ++aPlanesNb;
if (aLocation != OpenGl_ShaderProgram::INVALID_LOCATION) }
{ if (aPlanesNb < 1)
const Graphic3d_ClipPlane::Equation& anEquation = aPlane->GetEquation(); {
theProgram->SetUniform (myContext, aLocation, OpenGl_Vec4 ((float) anEquation.x(), return;
(float) anEquation.y(),
(float) anEquation.z(),
(float) anEquation.w()));
}
theProgram->SetUniform (myContext,
theProgram->GetStateLocation (OpenGl_OCC_CLIP_PLANE_0_SPACE + anIndex),
myContext->Clipping().GetEquationSpace (aPlane));
++anIndex;
} }
theProgram->UpdateState (OpenGl_CLIP_PLANES_STATE, myClippingState.Index()); OpenGl_Vec4* anEquations = new OpenGl_Vec4[aPlanesNb];
GLint* aSpaces = new GLint [aPlanesNb];
GLuint aPlaneId = 0;
for (Graphic3d_SetOfHClipPlane::Iterator anIter (myContext->Clipping().Planes());
anIter.More(); anIter.Next())
{
const Handle(Graphic3d_ClipPlane)& aPlane = anIter.Value();
if (!myContext->Clipping().IsEnabled (aPlane))
{
continue;
}
const Graphic3d_ClipPlane::Equation& anEquation = aPlane->GetEquation();
anEquations[aPlaneId] = OpenGl_Vec4 ((float) anEquation.x(),
(float) anEquation.y(),
(float) anEquation.z(),
(float) anEquation.w());
aSpaces[aPlaneId] = myContext->Clipping().GetEquationSpace (aPlane);
++aPlaneId;
}
myContext->core20->glUniform4fv (aLocEquations, aPlanesNb, anEquations[0].GetData());
myContext->core20->glUniform1iv (aLocSpaces, aPlanesNb, aSpaces);
delete[] anEquations;
delete[] aSpaces;
} }
// ======================================================================= // =======================================================================
@ -559,65 +569,48 @@ static void PushAspectFace (const Handle(OpenGl_Context)& theCtx,
theProgram->SetUniform (theCtx, theProgram->SetUniform (theCtx,
theProgram->GetStateLocation (OpenGl_OCCT_TEXTURE_ENABLE), theProgram->GetStateLocation (OpenGl_OCCT_TEXTURE_ENABLE),
theAspect->DoTextureMap()); theAspect->DoTextureMap());
theProgram->SetUniform (theCtx, theProgram->SetUniform (theCtx,
theProgram->GetStateLocation (OpenGl_OCCT_ACTIVE_SAMPLER), theProgram->GetStateLocation (OpenGl_OCCT_ACTIVE_SAMPLER),
0 /* GL_TEXTURE0 */); 0 /* GL_TEXTURE0 */);
theProgram->SetUniform (theCtx, theProgram->SetUniform (theCtx,
theProgram->GetStateLocation (OpenGl_OCCT_DISTINGUISH_MODE), theProgram->GetStateLocation (OpenGl_OCCT_DISTINGUISH_MODE),
theAspect->DistinguishingMode()); theAspect->DistinguishingMode());
for (int anIndex = 0; anIndex < 2; ++anIndex) OpenGl_Vec4 aParams[5];
for (Standard_Integer anIndex = 0; anIndex < 2; ++anIndex)
{ {
const OPENGL_SURF_PROP& aProperties = (anIndex == 0) ? theAspect->IntFront() : theAspect->IntBack(); const GLint aLoc = theProgram->GetStateLocation (anIndex == 0
GLint aLocation = theProgram->GetStateLocation (OpenGl_OCCT_FRONT_MATERIAL_AMBIENT + anIndex); ? OpenGl_OCCT_FRONT_MATERIAL
if (aLocation != OpenGl_ShaderProgram::INVALID_LOCATION) : OpenGl_OCCT_BACK_MATERIAL);
if (aLoc == OpenGl_ShaderProgram::INVALID_LOCATION)
{ {
OpenGl_Vec4 anAmbient (aProperties.ambcol.rgb[0] * aProperties.amb, continue;
aProperties.ambcol.rgb[1] * aProperties.amb,
aProperties.ambcol.rgb[2] * aProperties.amb,
aProperties.ambcol.rgb[3] * aProperties.amb);
theProgram->SetUniform (theCtx, aLocation, anAmbient);
} }
aLocation = theProgram->GetStateLocation (OpenGl_OCCT_FRONT_MATERIAL_DIFFUSE + anIndex); const OPENGL_SURF_PROP& aProps = (anIndex == 0) ? theAspect->IntFront() : theAspect->IntBack();
if (aLocation != OpenGl_ShaderProgram::INVALID_LOCATION) const OpenGl_Vec4 anEmission (aProps.emscol.rgb[0] * aProps.emsv,
{ aProps.emscol.rgb[1] * aProps.emsv,
OpenGl_Vec4 aDiffuse (aProperties.difcol.rgb[0] * aProperties.diff, aProps.emscol.rgb[2] * aProps.emsv,
aProperties.difcol.rgb[1] * aProperties.diff, aProps.emscol.rgb[3] * aProps.emsv);
aProperties.difcol.rgb[2] * aProperties.diff, const OpenGl_Vec4 anAmbient (aProps.ambcol.rgb[0] * aProps.amb,
aProperties.difcol.rgb[3] * aProperties.diff); aProps.ambcol.rgb[1] * aProps.amb,
theProgram->SetUniform (theCtx, aLocation, aDiffuse); aProps.ambcol.rgb[2] * aProps.amb,
} aProps.ambcol.rgb[3] * aProps.amb);
const OpenGl_Vec4 aDiffuse (aProps.difcol.rgb[0] * aProps.diff,
aLocation = theProgram->GetStateLocation (OpenGl_OCCT_FRONT_MATERIAL_SPECULAR + anIndex); aProps.difcol.rgb[1] * aProps.diff,
if (aLocation != OpenGl_ShaderProgram::INVALID_LOCATION) aProps.difcol.rgb[2] * aProps.diff,
{ aProps.difcol.rgb[3] * aProps.diff);
OpenGl_Vec4 aSpecular (aProperties.speccol.rgb[0] * aProperties.spec, const OpenGl_Vec4 aSpecular (aProps.speccol.rgb[0] * aProps.spec,
aProperties.speccol.rgb[1] * aProperties.spec, aProps.speccol.rgb[1] * aProps.spec,
aProperties.speccol.rgb[2] * aProperties.spec, aProps.speccol.rgb[2] * aProps.spec,
aProperties.speccol.rgb[3] * aProperties.spec); aProps.speccol.rgb[3] * aProps.spec);
theProgram->SetUniform (theCtx, aLocation, aSpecular); aParams[0] = anEmission;
} aParams[1] = anAmbient;
aParams[2] = aDiffuse;
aLocation = theProgram->GetStateLocation (OpenGl_OCCT_FRONT_MATERIAL_EMISSION + anIndex); aParams[3] = aSpecular;
if (aLocation != OpenGl_ShaderProgram::INVALID_LOCATION) aParams[4].x() = aProps.shine;
{ aParams[4].y() = aProps.trans;
OpenGl_Vec4 anEmission (aProperties.emscol.rgb[0] * aProperties.emsv, theCtx->core20->glUniform4fv (aLoc, 5, aParams[0].GetData());
aProperties.emscol.rgb[1] * aProperties.emsv,
aProperties.emscol.rgb[2] * aProperties.emsv,
aProperties.emscol.rgb[3] * aProperties.emsv);
theProgram->SetUniform (theCtx, aLocation, anEmission);
}
theProgram->SetUniform (theCtx,
theProgram->GetStateLocation (OpenGl_OCCT_FRONT_MATERIAL_SHININESS + anIndex),
aProperties.shine);
theProgram->SetUniform (theCtx,
theProgram->GetStateLocation (OpenGl_OCCT_FRONT_MATERIAL_TRANSPARENCY + anIndex),
aProperties.trans);
} }
} }
@ -636,21 +629,15 @@ static void PushAspectLine (const Handle(OpenGl_Context)& theCtx,
theAspect->Color().rgb[1], theAspect->Color().rgb[1],
theAspect->Color().rgb[2], theAspect->Color().rgb[2],
theAspect->Color().rgb[3]); theAspect->Color().rgb[3]);
theProgram->SetUniform (theCtx, OpenGl_Vec4 aParams[5];
theProgram->GetStateLocation (OpenGl_OCCT_FRONT_MATERIAL_AMBIENT), aParams[0] = THE_COLOR_BLACK_VEC4;
THE_COLOR_BLACK_VEC4); aParams[1] = THE_COLOR_BLACK_VEC4;
theProgram->SetUniform (theCtx, aParams[2] = aDiffuse;
theProgram->GetStateLocation (OpenGl_OCCT_FRONT_MATERIAL_DIFFUSE), aParams[3] = THE_COLOR_BLACK_VEC4;
aDiffuse); aParams[4].x() = 0.0f; // shininess
theProgram->SetUniform (theCtx, aParams[4].y() = 0.0f; // transparency
theProgram->GetStateLocation (OpenGl_OCCT_FRONT_MATERIAL_SPECULAR), theCtx->core20->glUniform4fv (theProgram->GetStateLocation (OpenGl_OCCT_FRONT_MATERIAL),
THE_COLOR_BLACK_VEC4); 5, aParams[0].GetData());
theProgram->SetUniform (theCtx,
theProgram->GetStateLocation (OpenGl_OCCT_FRONT_MATERIAL_EMISSION),
THE_COLOR_BLACK_VEC4);
theProgram->SetUniform (theCtx,
theProgram->GetStateLocation (OpenGl_OCCT_FRONT_MATERIAL_TRANSPARENCY),
0.0f);
} }
// ======================================================================= // =======================================================================
@ -678,21 +665,15 @@ static void PushAspectText (const Handle(OpenGl_Context)& theCtx,
theAspect->SubtitleColor().rgb[3]); theAspect->SubtitleColor().rgb[3]);
} }
theProgram->SetUniform (theCtx, OpenGl_Vec4 aParams[5];
theProgram->GetStateLocation (OpenGl_OCCT_FRONT_MATERIAL_AMBIENT), aParams[0] = THE_COLOR_BLACK_VEC4;
THE_COLOR_BLACK_VEC4); aParams[1] = THE_COLOR_BLACK_VEC4;
theProgram->SetUniform (theCtx, aParams[2] = aDiffuse;
theProgram->GetStateLocation (OpenGl_OCCT_FRONT_MATERIAL_DIFFUSE), aParams[3] = THE_COLOR_BLACK_VEC4;
aDiffuse); aParams[4].x() = 0.0f; // shininess
theProgram->SetUniform (theCtx, aParams[4].y() = 0.0f; // transparency
theProgram->GetStateLocation (OpenGl_OCCT_FRONT_MATERIAL_SPECULAR), theCtx->core20->glUniform4fv (theProgram->GetStateLocation (OpenGl_OCCT_FRONT_MATERIAL),
THE_COLOR_BLACK_VEC4); 5, aParams[0].GetData());
theProgram->SetUniform (theCtx,
theProgram->GetStateLocation (OpenGl_OCCT_FRONT_MATERIAL_EMISSION),
THE_COLOR_BLACK_VEC4);
theProgram->SetUniform (theCtx,
theProgram->GetStateLocation (OpenGl_OCCT_FRONT_MATERIAL_TRANSPARENCY),
0.0f);
} }
// ======================================================================= // =======================================================================
@ -711,22 +692,15 @@ static void PushAspectMarker (const Handle(OpenGl_Context)& theCtx,
theAspect->Color().rgb[1], theAspect->Color().rgb[1],
theAspect->Color().rgb[2], theAspect->Color().rgb[2],
theAspect->Color().rgb[3]); theAspect->Color().rgb[3]);
OpenGl_Vec4 aParams[5];
theProgram->SetUniform (theCtx, aParams[0] = THE_COLOR_BLACK_VEC4;
theProgram->GetStateLocation (OpenGl_OCCT_FRONT_MATERIAL_AMBIENT), aParams[1] = THE_COLOR_BLACK_VEC4;
THE_COLOR_BLACK_VEC4); aParams[2] = aDiffuse;
theProgram->SetUniform (theCtx, aParams[3] = THE_COLOR_BLACK_VEC4;
theProgram->GetStateLocation (OpenGl_OCCT_FRONT_MATERIAL_DIFFUSE), aParams[4].x() = 0.0f; // shininess
aDiffuse); aParams[4].y() = 0.0f; // transparency
theProgram->SetUniform (theCtx, theCtx->core20->glUniform4fv (theProgram->GetStateLocation (OpenGl_OCCT_FRONT_MATERIAL),
theProgram->GetStateLocation (OpenGl_OCCT_FRONT_MATERIAL_SPECULAR), 5, aParams[0].GetData());
THE_COLOR_BLACK_VEC4);
theProgram->SetUniform (theCtx,
theProgram->GetStateLocation (OpenGl_OCCT_FRONT_MATERIAL_EMISSION),
THE_COLOR_BLACK_VEC4);
theProgram->SetUniform (theCtx,
theProgram->GetStateLocation (OpenGl_OCCT_FRONT_MATERIAL_TRANSPARENCY),
0.0f);
} }
}; // nameless namespace }; // nameless namespace
@ -780,4 +754,4 @@ void OpenGl_ShaderManager::PushState (const Handle(OpenGl_ShaderProgram)& thePro
PushModelWorldState (theProgram); PushModelWorldState (theProgram);
PushProjectionState (theProgram); PushProjectionState (theProgram);
PushLightSourceState (theProgram); PushLightSourceState (theProgram);
} }

View File

@ -36,153 +36,32 @@ OpenGl_VariableSetterSelector OpenGl_ShaderProgram::mySetterSelector = OpenGl_Va
// Declare OCCT-specific OpenGL/GLSL shader variables // Declare OCCT-specific OpenGL/GLSL shader variables
Standard_CString OpenGl_ShaderProgram::PredefinedKeywords[] = Standard_CString OpenGl_ShaderProgram::PredefinedKeywords[] =
{ {
/* OpenGl_OCC_MODEL_WORLD_MATRIX */ "occModelWorldMatrix", "occModelWorldMatrix", // OpenGl_OCC_MODEL_WORLD_MATRIX
/* OpenGl_OCC_WORLD_VIEW_MATRIX */ "occWorldViewMatrix", "occWorldViewMatrix", // OpenGl_OCC_WORLD_VIEW_MATRIX
/* OpenGl_OCC_PROJECTION_MATRIX */ "occProjectionMatrix", "occProjectionMatrix", // OpenGl_OCC_PROJECTION_MATRIX
/* OpenGl_OCC_MODEL_WORLD_MATRIX_INVERSE */ "occModelWorldMatrixInverse", "occModelWorldMatrixInverse", // OpenGl_OCC_MODEL_WORLD_MATRIX_INVERSE
/* OpenGl_OCC_WORLD_VIEW_MATRIX_INVERSE */ "occWorldViewMatrixInverse", "occWorldViewMatrixInverse", // OpenGl_OCC_WORLD_VIEW_MATRIX_INVERSE
/* OpenGl_OCC_PROJECTION_MATRIX_INVERSE */ "occProjectionMatrixInverse", "occProjectionMatrixInverse", // OpenGl_OCC_PROJECTION_MATRIX_INVERSE
/* OpenGl_OCC_MODEL_WORLD_MATRIX_TRANSPOSE */ "occModelWorldMatrixTranspose", "occModelWorldMatrixTranspose", // OpenGl_OCC_MODEL_WORLD_MATRIX_TRANSPOSE
/* OpenGl_OCC_WORLD_VIEW_MATRIX_TRANSPOSE */ "occWorldViewMatrixTranspose", "occWorldViewMatrixTranspose", // OpenGl_OCC_WORLD_VIEW_MATRIX_TRANSPOSE
/* OpenGl_OCC_PROJECTION_MATRIX_TRANSPOSE */ "occProjectionMatrixTranspose", "occProjectionMatrixTranspose", // OpenGl_OCC_PROJECTION_MATRIX_TRANSPOSE
/* OpenGl_OCC_MODEL_WORLD_MATRIX_INVERSE_TRANSPOSE */ "occModelWorldMatrixInverseTranspose", "occModelWorldMatrixInverseTranspose", // OpenGl_OCC_MODEL_WORLD_MATRIX_INVERSE_TRANSPOSE
/* OpenGl_OCC_WORLD_VIEW_MATRIX_INVERSE_TRANSPOSE */ "occWorldViewMatrixInverseTranspose", "occWorldViewMatrixInverseTranspose", // OpenGl_OCC_WORLD_VIEW_MATRIX_INVERSE_TRANSPOSE
/* OpenGl_OCC_PROJECTION_MATRIX_INVERSE_TRANSPOSE */ "occProjectionMatrixInverseTranspose", "occProjectionMatrixInverseTranspose", // OpenGl_OCC_PROJECTION_MATRIX_INVERSE_TRANSPOSE
/* OpenGl_OCC_CLIP_PLANE_0_EQUATION */ "occClipPlanes[0].Equation", "occClipPlaneEquations", // OpenGl_OCC_CLIP_PLANE_EQUATIONS
/* OpenGl_OCC_CLIP_PLANE_1_EQUATION */ "occClipPlanes[1].Equation", "occClipPlaneSpaces", // OpenGl_OCC_CLIP_PLANE_SPACES
/* OpenGl_OCC_CLIP_PLANE_2_EQUATION */ "occClipPlanes[2].Equation",
/* OpenGl_OCC_CLIP_PLANE_3_EQUATION */ "occClipPlanes[3].Equation",
/* OpenGl_OCC_CLIP_PLANE_4_EQUATION */ "occClipPlanes[4].Equation",
/* OpenGl_OCC_CLIP_PLANE_5_EQUATION */ "occClipPlanes[5].Equation",
/* OpenGl_OCC_CLIP_PLANE_6_EQUATION */ "occClipPlanes[6].Equation",
/* OpenGl_OCC_CLIP_PLANE_7_EQUATION */ "occClipPlanes[7].Equation",
/* OpenGl_OCC_CLIP_PLANE_0_SPACE */ "occClipPlanes[0].Space", "occLightSourcesCount", // OpenGl_OCC_LIGHT_SOURCE_COUNT
/* OpenGl_OCC_CLIP_PLANE_1_SPACE */ "occClipPlanes[1].Space", "occLightSourcesTypes", // OpenGl_OCC_LIGHT_SOURCE_TYPES
/* OpenGl_OCC_CLIP_PLANE_2_SPACE */ "occClipPlanes[2].Space", "occLightSources", // OpenGl_OCC_LIGHT_SOURCE_PARAMS
/* OpenGl_OCC_CLIP_PLANE_3_SPACE */ "occClipPlanes[3].Space", "occLightAmbient", // OpenGl_OCC_LIGHT_AMBIENT
/* OpenGl_OCC_CLIP_PLANE_4_SPACE */ "occClipPlanes[4].Space",
/* OpenGl_OCC_CLIP_PLANE_5_SPACE */ "occClipPlanes[5].Space",
/* OpenGl_OCC_CLIP_PLANE_6_SPACE */ "occClipPlanes[6].Space",
/* OpenGl_OCC_CLIP_PLANE_7_SPACE */ "occClipPlanes[7].Space",
/* OpenGl_OCC_LIGHT_SOURCE_COUNT */ "occLightSourcesCount", "occActiveSampler", // OpenGl_OCCT_ACTIVE_SAMPLER
"occTextureEnable", // OpenGl_OCCT_TEXTURE_ENABLE
/* OpenGl_OCC_LIGHT_SOURCE_0_TYPE */ "occLightSources[0].Type", "occDistinguishingMode", // OpenGl_OCCT_DISTINGUISH_MODE
/* OpenGl_OCC_LIGHT_SOURCE_1_TYPE */ "occLightSources[1].Type", "occFrontMaterial", // OpenGl_OCCT_FRONT_MATERIAL
/* OpenGl_OCC_LIGHT_SOURCE_2_TYPE */ "occLightSources[2].Type", "occBackMaterial" // OpenGl_OCCT_BACK_MATERIAL
/* OpenGl_OCC_LIGHT_SOURCE_3_TYPE */ "occLightSources[3].Type",
/* OpenGl_OCC_LIGHT_SOURCE_4_TYPE */ "occLightSources[4].Type",
/* OpenGl_OCC_LIGHT_SOURCE_5_TYPE */ "occLightSources[5].Type",
/* OpenGl_OCC_LIGHT_SOURCE_6_TYPE */ "occLightSources[6].Type",
/* OpenGl_OCC_LIGHT_SOURCE_7_TYPE */ "occLightSources[7].Type",
/* OpenGl_OCC_LIGHT_SOURCE_0_HEAD */ "occLightSources[0].Head",
/* OpenGl_OCC_LIGHT_SOURCE_1_HEAD */ "occLightSources[1].Head",
/* OpenGl_OCC_LIGHT_SOURCE_2_HEAD */ "occLightSources[2].Head",
/* OpenGl_OCC_LIGHT_SOURCE_3_HEAD */ "occLightSources[3].Head",
/* OpenGl_OCC_LIGHT_SOURCE_4_HEAD */ "occLightSources[4].Head",
/* OpenGl_OCC_LIGHT_SOURCE_5_HEAD */ "occLightSources[5].Head",
/* OpenGl_OCC_LIGHT_SOURCE_6_HEAD */ "occLightSources[6].Head",
/* OpenGl_OCC_LIGHT_SOURCE_7_HEAD */ "occLightSources[7].Head",
/* OpenGl_OCC_LIGHT_SOURCE_0_AMBIENT */ "occLightSources[0].Ambient",
/* OpenGl_OCC_LIGHT_SOURCE_1_AMBIENT */ "occLightSources[1].Ambient",
/* OpenGl_OCC_LIGHT_SOURCE_2_AMBIENT */ "occLightSources[2].Ambient",
/* OpenGl_OCC_LIGHT_SOURCE_3_AMBIENT */ "occLightSources[3].Ambient",
/* OpenGl_OCC_LIGHT_SOURCE_4_AMBIENT */ "occLightSources[4].Ambient",
/* OpenGl_OCC_LIGHT_SOURCE_5_AMBIENT */ "occLightSources[5].Ambient",
/* OpenGl_OCC_LIGHT_SOURCE_6_AMBIENT */ "occLightSources[6].Ambient",
/* OpenGl_OCC_LIGHT_SOURCE_7_AMBIENT */ "occLightSources[7].Ambient",
/* OpenGl_OCC_LIGHT_SOURCE_0_DIFFUSE */ "occLightSources[0].Diffuse",
/* OpenGl_OCC_LIGHT_SOURCE_1_DIFFUSE */ "occLightSources[1].Diffuse",
/* OpenGl_OCC_LIGHT_SOURCE_2_DIFFUSE */ "occLightSources[2].Diffuse",
/* OpenGl_OCC_LIGHT_SOURCE_3_DIFFUSE */ "occLightSources[3].Diffuse",
/* OpenGl_OCC_LIGHT_SOURCE_4_DIFFUSE */ "occLightSources[4].Diffuse",
/* OpenGl_OCC_LIGHT_SOURCE_5_DIFFUSE */ "occLightSources[5].Diffuse",
/* OpenGl_OCC_LIGHT_SOURCE_6_DIFFUSE */ "occLightSources[6].Diffuse",
/* OpenGl_OCC_LIGHT_SOURCE_7_DIFFUSE */ "occLightSources[7].Diffuse",
/* OpenGl_OCC_LIGHT_SOURCE_0_SPECULAR */ "occLightSources[0].Specular",
/* OpenGl_OCC_LIGHT_SOURCE_1_SPECULAR */ "occLightSources[1].Specular",
/* OpenGl_OCC_LIGHT_SOURCE_2_SPECULAR */ "occLightSources[2].Specular",
/* OpenGl_OCC_LIGHT_SOURCE_3_SPECULAR */ "occLightSources[3].Specular",
/* OpenGl_OCC_LIGHT_SOURCE_4_SPECULAR */ "occLightSources[4].Specular",
/* OpenGl_OCC_LIGHT_SOURCE_5_SPECULAR */ "occLightSources[5].Specular",
/* OpenGl_OCC_LIGHT_SOURCE_6_SPECULAR */ "occLightSources[6].Specular",
/* OpenGl_OCC_LIGHT_SOURCE_7_SPECULAR */ "occLightSources[7].Specular",
/* OpenGl_OCC_LIGHT_SOURCE_0_POSITION */ "occLightSources[0].Position",
/* OpenGl_OCC_LIGHT_SOURCE_1_POSITION */ "occLightSources[1].Position",
/* OpenGl_OCC_LIGHT_SOURCE_2_POSITION */ "occLightSources[2].Position",
/* OpenGl_OCC_LIGHT_SOURCE_3_POSITION */ "occLightSources[3].Position",
/* OpenGl_OCC_LIGHT_SOURCE_4_POSITION */ "occLightSources[4].Position",
/* OpenGl_OCC_LIGHT_SOURCE_5_POSITION */ "occLightSources[5].Position",
/* OpenGl_OCC_LIGHT_SOURCE_6_POSITION */ "occLightSources[6].Position",
/* OpenGl_OCC_LIGHT_SOURCE_7_POSITION */ "occLightSources[7].Position",
/* OpenGl_OCC_LIGHT_SOURCE_0_SPOT_CUTOFF */ "occLightSources[0].SpotCutoff",
/* OpenGl_OCC_LIGHT_SOURCE_1_SPOT_CUTOFF */ "occLightSources[1].SpotCutoff",
/* OpenGl_OCC_LIGHT_SOURCE_2_SPOT_CUTOFF */ "occLightSources[2].SpotCutoff",
/* OpenGl_OCC_LIGHT_SOURCE_3_SPOT_CUTOFF */ "occLightSources[3].SpotCutoff",
/* OpenGl_OCC_LIGHT_SOURCE_4_SPOT_CUTOFF */ "occLightSources[4].SpotCutoff",
/* OpenGl_OCC_LIGHT_SOURCE_5_SPOT_CUTOFF */ "occLightSources[5].SpotCutoff",
/* OpenGl_OCC_LIGHT_SOURCE_6_SPOT_CUTOFF */ "occLightSources[6].SpotCutoff",
/* OpenGl_OCC_LIGHT_SOURCE_7_SPOT_CUTOFF */ "occLightSources[7].SpotCutoff",
/* OpenGl_OCC_LIGHT_SOURCE_0_SPOT_EXPONENT */ "occLightSources[0].SpotExponent",
/* OpenGl_OCC_LIGHT_SOURCE_1_SPOT_EXPONENT */ "occLightSources[1].SpotExponent",
/* OpenGl_OCC_LIGHT_SOURCE_2_SPOT_EXPONENT */ "occLightSources[2].SpotExponent",
/* OpenGl_OCC_LIGHT_SOURCE_3_SPOT_EXPONENT */ "occLightSources[3].SpotExponent",
/* OpenGl_OCC_LIGHT_SOURCE_4_SPOT_EXPONENT */ "occLightSources[4].SpotExponent",
/* OpenGl_OCC_LIGHT_SOURCE_5_SPOT_EXPONENT */ "occLightSources[5].SpotExponent",
/* OpenGl_OCC_LIGHT_SOURCE_6_SPOT_EXPONENT */ "occLightSources[6].SpotExponent",
/* OpenGl_OCC_LIGHT_SOURCE_7_SPOT_EXPONENT */ "occLightSources[7].SpotExponent",
/* OpenGl_OCC_LIGHT_SOURCE_0_SPOT_DIRECTION */ "occLightSources[0].SpotDirection",
/* OpenGl_OCC_LIGHT_SOURCE_1_SPOT_DIRECTION */ "occLightSources[1].SpotDirection",
/* OpenGl_OCC_LIGHT_SOURCE_2_SPOT_DIRECTION */ "occLightSources[2].SpotDirection",
/* OpenGl_OCC_LIGHT_SOURCE_3_SPOT_DIRECTION */ "occLightSources[3].SpotDirection",
/* OpenGl_OCC_LIGHT_SOURCE_4_SPOT_DIRECTION */ "occLightSources[4].SpotDirection",
/* OpenGl_OCC_LIGHT_SOURCE_5_SPOT_DIRECTION */ "occLightSources[5].SpotDirection",
/* OpenGl_OCC_LIGHT_SOURCE_6_SPOT_DIRECTION */ "occLightSources[6].SpotDirection",
/* OpenGl_OCC_LIGHT_SOURCE_7_SPOT_DIRECTION */ "occLightSources[7].SpotDirection",
/* OpenGl_OCC_LIGHT_SOURCE_0_CONST_ATTENUATION */ "occLightSources[0].ConstAttenuation",
/* OpenGl_OCC_LIGHT_SOURCE_1_CONST_ATTENUATION */ "occLightSources[1].ConstAttenuation",
/* OpenGl_OCC_LIGHT_SOURCE_2_CONST_ATTENUATION */ "occLightSources[2].ConstAttenuation",
/* OpenGl_OCC_LIGHT_SOURCE_3_CONST_ATTENUATION */ "occLightSources[3].ConstAttenuation",
/* OpenGl_OCC_LIGHT_SOURCE_4_CONST_ATTENUATION */ "occLightSources[4].ConstAttenuation",
/* OpenGl_OCC_LIGHT_SOURCE_5_CONST_ATTENUATION */ "occLightSources[5].ConstAttenuation",
/* OpenGl_OCC_LIGHT_SOURCE_6_CONST_ATTENUATION */ "occLightSources[6].ConstAttenuation",
/* OpenGl_OCC_LIGHT_SOURCE_7_CONST_ATTENUATION */ "occLightSources[7].ConstAttenuation",
/* OpenGl_OCC_LIGHT_SOURCE_0_LINEAR_ATTENUATION */ "occLightSources[0].LinearAttenuation",
/* OpenGl_OCC_LIGHT_SOURCE_1_LINEAR_ATTENUATION */ "occLightSources[1].LinearAttenuation",
/* OpenGl_OCC_LIGHT_SOURCE_2_LINEAR_ATTENUATION */ "occLightSources[2].LinearAttenuation",
/* OpenGl_OCC_LIGHT_SOURCE_3_LINEAR_ATTENUATION */ "occLightSources[3].LinearAttenuation",
/* OpenGl_OCC_LIGHT_SOURCE_4_LINEAR_ATTENUATION */ "occLightSources[4].LinearAttenuation",
/* OpenGl_OCC_LIGHT_SOURCE_5_LINEAR_ATTENUATION */ "occLightSources[5].LinearAttenuation",
/* OpenGl_OCC_LIGHT_SOURCE_6_LINEAR_ATTENUATION */ "occLightSources[6].LinearAttenuation",
/* OpenGl_OCC_LIGHT_SOURCE_7_LINEAR_ATTENUATION */ "occLightSources[7].LinearAttenuation",
/* OpenGl_OCCT_ACTIVE_SAMPLER */ "occActiveSampler",
/* OpenGl_OCCT_TEXTURE_ENABLE */ "occTextureEnable",
/* OpenGl_OCCT_DISTINGUISH_MODE */ "occDistinguishingMode",
/* OpenGl_OCCT_FRONT_MATERIAL_AMBIENT */ "occFrontMaterial.Ambient",
/* OpenGl_OCCT_BACK_MATERIAL_AMBIENT */ "occBackMaterial.Ambient",
/* OpenGl_OCCT_FRONT_MATERIAL_DIFFUSE */ "occFrontMaterial.Diffuse",
/* OpenGl_OCCT_BACK_MATERIAL_DIFFUSE */ "occBackMaterial.Diffuse",
/* OpenGl_OCCT_FRONT_MATERIAL_SPECULAR */ "occFrontMaterial.Specular",
/* OpenGl_OCCT_BACK_MATERIAL_SPECULAR */ "occBackMaterial.Specular",
/* OpenGl_OCCT_FRONT_MATERIAL_EMISSION */ "occFrontMaterial.Emission",
/* OpenGl_OCCT_BACK_MATERIAL_EMISSION */ "occBackMaterial.Emission",
/* OpenGl_OCCT_FRONT_MATERIAL_SHININESS */ "occFrontMaterial.Shininess",
/* OpenGl_OCCT_BACK_MATERIAL_SHININESS */ "occBackMaterial.Shininess",
/* OpenGl_OCCT_FRONT_MATERIAL_TRANSPARENCY */ "occFrontMaterial.Transparency",
/* OpenGl_OCCT_BACK_MATERIAL_TRANSPARENCY */ "occBackMaterial.Transparency"
}; };
@ -260,8 +139,10 @@ Standard_Boolean OpenGl_ShaderProgram::Initialize (const Handle(OpenGl_Context)&
return Standard_False; return Standard_False;
} }
OSD_File aDeclFile (Graphic3d_ShaderProgram::ShadersFolder() + "/Declarations.glsl"); OSD_File aDeclFile (Graphic3d_ShaderProgram::ShadersFolder() + "/Declarations.glsl");
if (!aDeclFile.Exists()) OSD_File aDeclImplFile (Graphic3d_ShaderProgram::ShadersFolder() + "/DeclarationsImpl.glsl");
if (!aDeclFile.Exists()
|| !aDeclImplFile.Exists())
{ {
const TCollection_ExtendedString aMsg = "Error! Failed to load OCCT shader declarations file"; const TCollection_ExtendedString aMsg = "Error! Failed to load OCCT shader declarations file";
theCtx->PushMessage (GL_DEBUG_SOURCE_APPLICATION_ARB, theCtx->PushMessage (GL_DEBUG_SOURCE_APPLICATION_ARB,
@ -273,11 +154,16 @@ Standard_Boolean OpenGl_ShaderProgram::Initialize (const Handle(OpenGl_Context)&
} }
TCollection_AsciiString aDeclarations; TCollection_AsciiString aDeclarations;
aDeclFile.Open (OSD_ReadOnly, OSD_Protection()); aDeclFile.Open (OSD_ReadOnly, OSD_Protection());
aDeclFile.Read (aDeclarations, (int)aDeclFile.Size()); aDeclFile.Read (aDeclarations, (int)aDeclFile.Size());
aDeclFile.Close(); aDeclFile.Close();
TCollection_AsciiString aDeclImpl;
aDeclImplFile.Open (OSD_ReadOnly, OSD_Protection());
aDeclImplFile.Read (aDeclImpl, (int)aDeclImplFile.Size());
aDeclImplFile.Close();
aDeclarations += aDeclImpl;
for (Graphic3d_ShaderObjectList::Iterator anIter (theShaders); for (Graphic3d_ShaderObjectList::Iterator anIter (theShaders);
anIter.More(); anIter.Next()) anIter.More(); anIter.Next())
{ {
@ -391,7 +277,7 @@ Standard_Boolean OpenGl_ShaderProgram::Initialize (const Handle(OpenGl_Context)&
GL_DEBUG_TYPE_ERROR_ARB, GL_DEBUG_TYPE_ERROR_ARB,
0, 0,
GL_DEBUG_SEVERITY_HIGH_ARB, GL_DEBUG_SEVERITY_HIGH_ARB,
TCollection_ExtendedString ("Failed to link program object! Linker log:\n")); TCollection_ExtendedString ("Failed to link program object! Linker log:\n") + aLog);
return Standard_False; return Standard_False;
} }
else if (theCtx->caps->glslWarnings) else if (theCtx->caps->glslWarnings)

View File

@ -52,131 +52,21 @@ enum OpenGl_StateVariable
OpenGl_OCC_PROJECTION_MATRIX_INVERSE_TRANSPOSE, OpenGl_OCC_PROJECTION_MATRIX_INVERSE_TRANSPOSE,
// OpenGL clip planes state // OpenGL clip planes state
OpenGl_OCC_CLIP_PLANE_0_EQUATION, OpenGl_OCC_CLIP_PLANE_EQUATIONS,
OpenGl_OCC_CLIP_PLANE_1_EQUATION, OpenGl_OCC_CLIP_PLANE_SPACES,
OpenGl_OCC_CLIP_PLANE_2_EQUATION,
OpenGl_OCC_CLIP_PLANE_3_EQUATION,
OpenGl_OCC_CLIP_PLANE_4_EQUATION,
OpenGl_OCC_CLIP_PLANE_5_EQUATION,
OpenGl_OCC_CLIP_PLANE_6_EQUATION,
OpenGl_OCC_CLIP_PLANE_7_EQUATION,
OpenGl_OCC_CLIP_PLANE_0_SPACE,
OpenGl_OCC_CLIP_PLANE_1_SPACE,
OpenGl_OCC_CLIP_PLANE_2_SPACE,
OpenGl_OCC_CLIP_PLANE_3_SPACE,
OpenGl_OCC_CLIP_PLANE_4_SPACE,
OpenGl_OCC_CLIP_PLANE_5_SPACE,
OpenGl_OCC_CLIP_PLANE_6_SPACE,
OpenGl_OCC_CLIP_PLANE_7_SPACE,
OpenGl_OCC_LIGHT_SOURCE_COUNT,
// OpenGL light state // OpenGL light state
OpenGl_OCC_LIGHT_SOURCE_0_TYPE, OpenGl_OCC_LIGHT_SOURCE_COUNT,
OpenGl_OCC_LIGHT_SOURCE_1_TYPE, OpenGl_OCC_LIGHT_SOURCE_TYPES,
OpenGl_OCC_LIGHT_SOURCE_2_TYPE, OpenGl_OCC_LIGHT_SOURCE_PARAMS,
OpenGl_OCC_LIGHT_SOURCE_3_TYPE, OpenGl_OCC_LIGHT_AMBIENT,
OpenGl_OCC_LIGHT_SOURCE_4_TYPE,
OpenGl_OCC_LIGHT_SOURCE_5_TYPE,
OpenGl_OCC_LIGHT_SOURCE_6_TYPE,
OpenGl_OCC_LIGHT_SOURCE_7_TYPE,
OpenGl_OCC_LIGHT_SOURCE_0_HEAD,
OpenGl_OCC_LIGHT_SOURCE_1_HEAD,
OpenGl_OCC_LIGHT_SOURCE_2_HEAD,
OpenGl_OCC_LIGHT_SOURCE_3_HEAD,
OpenGl_OCC_LIGHT_SOURCE_4_HEAD,
OpenGl_OCC_LIGHT_SOURCE_5_HEAD,
OpenGl_OCC_LIGHT_SOURCE_6_HEAD,
OpenGl_OCC_LIGHT_SOURCE_7_HEAD,
OpenGl_OCC_LIGHT_SOURCE_0_AMBIENT,
OpenGl_OCC_LIGHT_SOURCE_1_AMBIENT,
OpenGl_OCC_LIGHT_SOURCE_2_AMBIENT,
OpenGl_OCC_LIGHT_SOURCE_3_AMBIENT,
OpenGl_OCC_LIGHT_SOURCE_4_AMBIENT,
OpenGl_OCC_LIGHT_SOURCE_5_AMBIENT,
OpenGl_OCC_LIGHT_SOURCE_6_AMBIENT,
OpenGl_OCC_LIGHT_SOURCE_7_AMBIENT,
OpenGl_OCC_LIGHT_SOURCE_0_DIFFUSE,
OpenGl_OCC_LIGHT_SOURCE_1_DIFFUSE,
OpenGl_OCC_LIGHT_SOURCE_2_DIFFUSE,
OpenGl_OCC_LIGHT_SOURCE_3_DIFFUSE,
OpenGl_OCC_LIGHT_SOURCE_4_DIFFUSE,
OpenGl_OCC_LIGHT_SOURCE_5_DIFFUSE,
OpenGl_OCC_LIGHT_SOURCE_6_DIFFUSE,
OpenGl_OCC_LIGHT_SOURCE_7_DIFFUSE,
OpenGl_OCC_LIGHT_SOURCE_0_SPECULAR,
OpenGl_OCC_LIGHT_SOURCE_1_SPECULAR,
OpenGl_OCC_LIGHT_SOURCE_2_SPECULAR,
OpenGl_OCC_LIGHT_SOURCE_3_SPECULAR,
OpenGl_OCC_LIGHT_SOURCE_4_SPECULAR,
OpenGl_OCC_LIGHT_SOURCE_5_SPECULAR,
OpenGl_OCC_LIGHT_SOURCE_6_SPECULAR,
OpenGl_OCC_LIGHT_SOURCE_7_SPECULAR,
OpenGl_OCC_LIGHT_SOURCE_0_POSITION,
OpenGl_OCC_LIGHT_SOURCE_1_POSITION,
OpenGl_OCC_LIGHT_SOURCE_2_POSITION,
OpenGl_OCC_LIGHT_SOURCE_3_POSITION,
OpenGl_OCC_LIGHT_SOURCE_4_POSITION,
OpenGl_OCC_LIGHT_SOURCE_5_POSITION,
OpenGl_OCC_LIGHT_SOURCE_6_POSITION,
OpenGl_OCC_LIGHT_SOURCE_7_POSITION,
OpenGl_OCC_LIGHT_SOURCE_0_SPOT_CUTOFF,
OpenGl_OCC_LIGHT_SOURCE_1_SPOT_CUTOFF,
OpenGl_OCC_LIGHT_SOURCE_2_SPOT_CUTOFF,
OpenGl_OCC_LIGHT_SOURCE_3_SPOT_CUTOFF,
OpenGl_OCC_LIGHT_SOURCE_4_SPOT_CUTOFF,
OpenGl_OCC_LIGHT_SOURCE_5_SPOT_CUTOFF,
OpenGl_OCC_LIGHT_SOURCE_6_SPOT_CUTOFF,
OpenGl_OCC_LIGHT_SOURCE_7_SPOT_CUTOFF,
OpenGl_OCC_LIGHT_SOURCE_0_SPOT_EXPONENT,
OpenGl_OCC_LIGHT_SOURCE_1_SPOT_EXPONENT,
OpenGl_OCC_LIGHT_SOURCE_2_SPOT_EXPONENT,
OpenGl_OCC_LIGHT_SOURCE_3_SPOT_EXPONENT,
OpenGl_OCC_LIGHT_SOURCE_4_SPOT_EXPONENT,
OpenGl_OCC_LIGHT_SOURCE_5_SPOT_EXPONENT,
OpenGl_OCC_LIGHT_SOURCE_6_SPOT_EXPONENT,
OpenGl_OCC_LIGHT_SOURCE_7_SPOT_EXPONENT,
OpenGl_OCC_LIGHT_SOURCE_0_SPOT_DIRECTION,
OpenGl_OCC_LIGHT_SOURCE_1_SPOT_DIRECTION,
OpenGl_OCC_LIGHT_SOURCE_2_SPOT_DIRECTION,
OpenGl_OCC_LIGHT_SOURCE_3_SPOT_DIRECTION,
OpenGl_OCC_LIGHT_SOURCE_4_SPOT_DIRECTION,
OpenGl_OCC_LIGHT_SOURCE_5_SPOT_DIRECTION,
OpenGl_OCC_LIGHT_SOURCE_6_SPOT_DIRECTION,
OpenGl_OCC_LIGHT_SOURCE_7_SPOT_DIRECTION,
OpenGl_OCC_LIGHT_SOURCE_0_CONST_ATTENUATION,
OpenGl_OCC_LIGHT_SOURCE_1_CONST_ATTENUATION,
OpenGl_OCC_LIGHT_SOURCE_2_CONST_ATTENUATION,
OpenGl_OCC_LIGHT_SOURCE_3_CONST_ATTENUATION,
OpenGl_OCC_LIGHT_SOURCE_4_CONST_ATTENUATION,
OpenGl_OCC_LIGHT_SOURCE_5_CONST_ATTENUATION,
OpenGl_OCC_LIGHT_SOURCE_6_CONST_ATTENUATION,
OpenGl_OCC_LIGHT_SOURCE_7_CONST_ATTENUATION,
OpenGl_OCC_LIGHT_SOURCE_0_LINEAR_ATTENUATION,
OpenGl_OCC_LIGHT_SOURCE_1_LINEAR_ATTENUATION,
OpenGl_OCC_LIGHT_SOURCE_2_LINEAR_ATTENUATION,
OpenGl_OCC_LIGHT_SOURCE_3_LINEAR_ATTENUATION,
OpenGl_OCC_LIGHT_SOURCE_4_LINEAR_ATTENUATION,
OpenGl_OCC_LIGHT_SOURCE_5_LINEAR_ATTENUATION,
OpenGl_OCC_LIGHT_SOURCE_6_LINEAR_ATTENUATION,
OpenGl_OCC_LIGHT_SOURCE_7_LINEAR_ATTENUATION,
// Material state // Material state
OpenGl_OCCT_ACTIVE_SAMPLER, OpenGl_OCCT_ACTIVE_SAMPLER,
OpenGl_OCCT_TEXTURE_ENABLE, OpenGl_OCCT_TEXTURE_ENABLE,
OpenGl_OCCT_DISTINGUISH_MODE, OpenGl_OCCT_DISTINGUISH_MODE,
OpenGl_OCCT_FRONT_MATERIAL_AMBIENT, OpenGl_OCCT_FRONT_MATERIAL,
OpenGl_OCCT_BACK_MATERIAL_AMBIENT, OpenGl_OCCT_BACK_MATERIAL,
OpenGl_OCCT_FRONT_MATERIAL_DIFFUSE,
OpenGl_OCCT_BACK_MATERIAL_DIFFUSE,
OpenGl_OCCT_FRONT_MATERIAL_SPECULAR,
OpenGl_OCCT_BACK_MATERIAL_SPECULAR,
OpenGl_OCCT_FRONT_MATERIAL_EMISSION,
OpenGl_OCCT_BACK_MATERIAL_EMISSION,
OpenGl_OCCT_FRONT_MATERIAL_SHININESS,
OpenGl_OCCT_BACK_MATERIAL_SHININESS,
OpenGl_OCCT_FRONT_MATERIAL_TRANSPARENCY,
OpenGl_OCCT_BACK_MATERIAL_TRANSPARENCY,
// DON'T MODIFY THIS ITEM (insert new items before it) // DON'T MODIFY THIS ITEM (insert new items before it)
OpenGl_OCCT_NUMBER_OF_STATE_VARIABLES OpenGl_OCCT_NUMBER_OF_STATE_VARIABLES
@ -302,6 +192,12 @@ public:
//! Reverts to fixed-function graphics pipeline (FFP). //! Reverts to fixed-function graphics pipeline (FFP).
Standard_EXPORT static void Unbind (const Handle(OpenGl_Context)& theCtx); Standard_EXPORT static void Unbind (const Handle(OpenGl_Context)& theCtx);
//! @return true if current object was initialized
inline bool IsValid() const
{
return myProgramID != NO_PROGRAM;
}
private: private:
//! Returns index of last modification of variables of specified state type. //! Returns index of last modification of variables of specified state type.

View File

@ -197,83 +197,26 @@ void OpenGl_View::SetSurfaceDetail (const Visual3d_TypeOfSurfaceDetail theMode)
#endif #endif
} }
/*----------------------------------------------------------------------*/ // =======================================================================
// function : SetBackfacing
// purpose :
// =======================================================================
void OpenGl_View::SetBackfacing (const Standard_Integer theMode) void OpenGl_View::SetBackfacing (const Standard_Integer theMode)
{ {
myBackfacing = theMode; myBackfacing = theMode;
} }
/*----------------------------------------------------------------------*/ // =======================================================================
// function : SetLights
//call_togl_setlight // purpose :
void OpenGl_View::SetLights (const CALL_DEF_VIEWCONTEXT &AContext) // =======================================================================
void OpenGl_View::SetLights (const CALL_DEF_VIEWCONTEXT& theViewCtx)
{ {
myLights.Clear(); myLights.Clear();
for (Standard_Integer aLightIt = 0; aLightIt < theViewCtx.NbActiveLight; ++aLightIt)
const int nb_lights = AContext.NbActiveLight;
int i = 0;
const CALL_DEF_LIGHT *alight = &(AContext.ActiveLight[0]);
for ( ; i < nb_lights; i++, alight++ )
{ {
OpenGl_Light rep; myLights.Append (theViewCtx.ActiveLight[aLightIt]);
memset(&rep,0,sizeof(rep));
switch( alight->LightType )
{
case 0 : /* TOLS_AMBIENT */
rep.type = TLightAmbient;
rep.col.rgb[0] = alight->Color.r;
rep.col.rgb[1] = alight->Color.g;
rep.col.rgb[2] = alight->Color.b;
break;
case 1 : /* TOLS_DIRECTIONAL */
rep.type = TLightDirectional;
rep.col.rgb[0] = alight->Color.r;
rep.col.rgb[1] = alight->Color.g;
rep.col.rgb[2] = alight->Color.b;
rep.dir[0] = alight->Direction.x;
rep.dir[1] = alight->Direction.y;
rep.dir[2] = alight->Direction.z;
break;
case 2 : /* TOLS_POSITIONAL */
rep.type = TLightPositional;
rep.col.rgb[0] = alight->Color.r;
rep.col.rgb[1] = alight->Color.g;
rep.col.rgb[2] = alight->Color.b;
rep.pos[0] = alight->Position.x;
rep.pos[1] = alight->Position.y;
rep.pos[2] = alight->Position.z;
rep.atten[0] = alight->Attenuation[0];
rep.atten[1] = alight->Attenuation[1];
break;
case 3 : /* TOLS_SPOT */
rep.type = TLightSpot;
rep.col.rgb[0] = alight->Color.r;
rep.col.rgb[1] = alight->Color.g;
rep.col.rgb[2] = alight->Color.b;
rep.pos[0] = alight->Position.x;
rep.pos[1] = alight->Position.y;
rep.pos[2] = alight->Position.z;
rep.dir[0] = alight->Direction.x;
rep.dir[1] = alight->Direction.y;
rep.dir[2] = alight->Direction.z;
rep.shine = alight->Concentration;
rep.atten[0] = alight->Attenuation[0];
rep.atten[1] = alight->Attenuation[1];
rep.angle = alight->Angle;
break;
}
rep.HeadLight = alight->Headlight;
myLights.Append(rep);
} }
myCurrLightSourceState = myStateCounter->Increment(); myCurrLightSourceState = myStateCounter->Increment();
} }

View File

@ -43,10 +43,15 @@
#define EPSI 0.0001 #define EPSI 0.0001
static const GLfloat default_amb[4] = { 0.F, 0.F, 0.F, 1.F }; namespace
static const GLfloat default_sptdir[3] = { 0.F, 0.F, -1.F }; {
static const GLfloat default_sptexpo = 0.F;
static const GLfloat default_sptcutoff = 180.F; static const GLfloat THE_DEFAULT_AMBIENT[4] = { 0.0f, 0.0f, 0.0f, 1.0f };
static const GLfloat THE_DEFAULT_SPOT_DIR[3] = { 0.0f, 0.0f, -1.0f };
static const GLfloat THE_DEFAULT_SPOT_EXPONENT = 0.0f;
static const GLfloat THE_DEFAULT_SPOT_CUTOFF = 180.0f;
};
extern void InitLayerProp (const int theListId); //szvgl: defined in OpenGl_GraphicDriver_Layer.cxx extern void InitLayerProp (const int theListId); //szvgl: defined in OpenGl_GraphicDriver_Layer.cxx
@ -68,171 +73,89 @@ struct OPENGL_CLIP_PLANE
/* /*
* Set des lumieres * Set des lumieres
*/ */
static void bind_light(const OpenGl_Light *lptr, int *gl_lid) static void bind_light (const OpenGl_Light& theLight,
GLenum& theLightGlId)
{ {
// Only 8 lights in OpenGL... // Only 8 lights in OpenGL...
if (*gl_lid > GL_LIGHT7) return; if (theLightGlId > GL_LIGHT7)
// the light is a headlight ?
GLint cur_matrix = 0;
if (lptr->HeadLight)
{ {
glGetIntegerv(GL_MATRIX_MODE, &cur_matrix); return;
glMatrixMode(GL_MODELVIEW); }
if (theLight.Type == Visual3d_TOLS_AMBIENT)
{
// setup RGBA intensity of the ambient light
glLightModelfv (GL_LIGHT_MODEL_AMBIENT, theLight.Color.GetData());
return;
}
// the light is a headlight?
GLint aMatrixModeOld = 0;
if (theLight.IsHeadlight)
{
glGetIntegerv (GL_MATRIX_MODE, &aMatrixModeOld);
glMatrixMode (GL_MODELVIEW);
glPushMatrix(); glPushMatrix();
glLoadIdentity(); glLoadIdentity();
} }
GLfloat data_amb[4]; // setup light type
GLfloat data_diffu[4]; switch (theLight.Type)
GLfloat data_pos[4];
GLfloat data_sptdir[3];
GLfloat data_sptexpo;
GLfloat data_sptcutoff;
GLfloat data_constantattenuation;
GLfloat data_linearattenuation;
/* set la light en fonction de son type */
switch (lptr->type)
{ {
case TLightAmbient: case Visual3d_TOLS_DIRECTIONAL:
data_amb[0] = lptr->col.rgb[0]; {
data_amb[1] = lptr->col.rgb[1]; // if the last parameter of GL_POSITION, is zero, the corresponding light source is a Directional one
data_amb[2] = lptr->col.rgb[2]; const OpenGl_Vec4 anInfDir = -theLight.Direction;
data_amb[3] = 1.0;
/*------------------------- Ambient ---------------------------*/ // to create a realistic effect, set the GL_SPECULAR parameter to the same value as the GL_DIFFUSE.
/* glLightfv (theLightGlId, GL_AMBIENT, THE_DEFAULT_AMBIENT);
* The GL_AMBIENT parameter refers to RGBA intensity of the ambient glLightfv (theLightGlId, GL_DIFFUSE, theLight.Color.GetData());
* light. glLightfv (theLightGlId, GL_SPECULAR, theLight.Color.GetData());
*/ glLightfv (theLightGlId, GL_POSITION, anInfDir.GetData());
glLightModelfv(GL_LIGHT_MODEL_AMBIENT, data_amb); glLightfv (theLightGlId, GL_SPOT_DIRECTION, THE_DEFAULT_SPOT_DIR);
break; glLightf (theLightGlId, GL_SPOT_EXPONENT, THE_DEFAULT_SPOT_EXPONENT);
glLightf (theLightGlId, GL_SPOT_CUTOFF, THE_DEFAULT_SPOT_CUTOFF);
break;
case TLightDirectional: }
data_diffu[0] = lptr->col.rgb[0]; case Visual3d_TOLS_POSITIONAL:
data_diffu[1] = lptr->col.rgb[1]; {
data_diffu[2] = lptr->col.rgb[2]; // to create a realistic effect, set the GL_SPECULAR parameter to the same value as the GL_DIFFUSE
data_diffu[3] = 1.0; glLightfv (theLightGlId, GL_AMBIENT, THE_DEFAULT_AMBIENT);
glLightfv (theLightGlId, GL_DIFFUSE, theLight.Color.GetData());
/*------------------------- Direction ---------------------------*/ glLightfv (theLightGlId, GL_SPECULAR, theLight.Color.GetData());
/* From Open GL Programming Rev 1 Guide Chapt 6 : glLightfv (theLightGlId, GL_POSITION, theLight.Position.GetData());
Lighting The Mathematics of Lighting ( p 168 ) glLightfv (theLightGlId, GL_SPOT_DIRECTION, THE_DEFAULT_SPOT_DIR);
glLightf (theLightGlId, GL_SPOT_EXPONENT, THE_DEFAULT_SPOT_EXPONENT);
Directional Light Source ( Infinite ) : glLightf (theLightGlId, GL_SPOT_CUTOFF, THE_DEFAULT_SPOT_CUTOFF);
if the last parameter of GL_POSITION , w , is zero, the glLightf (theLightGlId, GL_CONSTANT_ATTENUATION, theLight.ConstAttenuation());
corresponding light source is a Directional one. glLightf (theLightGlId, GL_LINEAR_ATTENUATION, theLight.LinearAttenuation());
glLightf (theLightGlId, GL_QUADRATIC_ATTENUATION, 0.0);
GL_SPOT_CUTOFF a 180 signifie que ce n'est pas un spot. break;
To create a realistic effect, set the GL_SPECULAR parameter }
to the same value as the GL_DIFFUSE. case Visual3d_TOLS_SPOT:
*/ {
glLightfv (theLightGlId, GL_AMBIENT, THE_DEFAULT_AMBIENT);
data_pos[0] = -lptr->dir[0]; glLightfv (theLightGlId, GL_DIFFUSE, theLight.Color.GetData());
data_pos[1] = -lptr->dir[1]; glLightfv (theLightGlId, GL_SPECULAR, theLight.Color.GetData());
data_pos[2] = -lptr->dir[2]; glLightfv (theLightGlId, GL_POSITION, theLight.Position.GetData());
data_pos[3] = 0.0; glLightfv (theLightGlId, GL_SPOT_DIRECTION, theLight.Direction.GetData());
glLightf (theLightGlId, GL_SPOT_EXPONENT, theLight.Concentration() * 128.0f);
glLightfv(*gl_lid, GL_AMBIENT, default_amb); glLightf (theLightGlId, GL_SPOT_CUTOFF, (theLight.Angle() * 180.0f) / GLfloat(M_PI));
glLightfv(*gl_lid, GL_DIFFUSE, data_diffu); glLightf (theLightGlId, GL_CONSTANT_ATTENUATION, theLight.ConstAttenuation());
glLightfv(*gl_lid, GL_SPECULAR, data_diffu); glLightf (theLightGlId, GL_LINEAR_ATTENUATION, theLight.LinearAttenuation());
glLightf (theLightGlId, GL_QUADRATIC_ATTENUATION, 0.0f);
glLightfv(*gl_lid, GL_POSITION, data_pos); break;
glLightfv(*gl_lid, GL_SPOT_DIRECTION, default_sptdir); }
glLightf(*gl_lid, GL_SPOT_EXPONENT, default_sptexpo);
glLightf(*gl_lid, GL_SPOT_CUTOFF, default_sptcutoff);
break;
case TLightPositional:
data_diffu[0] = lptr->col.rgb[0];
data_diffu[1] = lptr->col.rgb[1];
data_diffu[2] = lptr->col.rgb[2];
data_diffu[3] = 1.0;
/*------------------------- Position -----------------------------*/
/* From Open GL Programming Rev 1 Guide Chapt 6 :
Lighting The Mathematics of Lighting ( p 168 )
Positional Light Source :
if the last parameter of GL_POSITION , w , is nonzero,
the corresponding light source is a Positional one.
GL_SPOT_CUTOFF a 180 signifie que ce n'est pas un spot.
To create a realistic effect, set the GL_SPECULAR parameter
to the same value as the GL_DIFFUSE.
*/
data_pos[0] = lptr->pos[0];
data_pos[1] = lptr->pos[1];
data_pos[2] = lptr->pos[2];
data_pos[3] = 1.0;
data_constantattenuation = lptr->atten[0];
data_linearattenuation = lptr->atten[1];
glLightfv(*gl_lid, GL_AMBIENT, default_amb);
glLightfv(*gl_lid, GL_DIFFUSE, data_diffu);
glLightfv(*gl_lid, GL_SPECULAR, data_diffu);
glLightfv(*gl_lid, GL_POSITION, data_pos);
glLightfv(*gl_lid, GL_SPOT_DIRECTION, default_sptdir);
glLightf(*gl_lid, GL_SPOT_EXPONENT, default_sptexpo);
glLightf(*gl_lid, GL_SPOT_CUTOFF, default_sptcutoff);
glLightf(*gl_lid, GL_CONSTANT_ATTENUATION, data_constantattenuation);
glLightf(*gl_lid, GL_LINEAR_ATTENUATION, data_linearattenuation);
glLightf(*gl_lid, GL_QUADRATIC_ATTENUATION, 0.0);
break;
case TLightSpot:
data_diffu[0] = lptr->col.rgb[0];
data_diffu[1] = lptr->col.rgb[1];
data_diffu[2] = lptr->col.rgb[2];
data_diffu[3] = 1.0;
data_pos[0] = lptr->pos[0];
data_pos[1] = lptr->pos[1];
data_pos[2] = lptr->pos[2];
data_pos[3] = 1.0;
data_sptdir[0] = lptr->dir[0];
data_sptdir[1] = lptr->dir[1];
data_sptdir[2] = lptr->dir[2];
data_sptexpo = ( float )lptr->shine * 128.0F;
data_sptcutoff = ( float )(lptr->angle * 180.0F)/( float )M_PI;
data_constantattenuation = lptr->atten[0];
data_linearattenuation = lptr->atten[1];
glLightfv(*gl_lid, GL_AMBIENT, default_amb);
glLightfv(*gl_lid, GL_DIFFUSE, data_diffu);
glLightfv(*gl_lid, GL_SPECULAR, data_diffu);
glLightfv(*gl_lid, GL_POSITION, data_pos);
glLightfv(*gl_lid, GL_SPOT_DIRECTION, data_sptdir);
glLightf(*gl_lid, GL_SPOT_EXPONENT, data_sptexpo);
glLightf(*gl_lid, GL_SPOT_CUTOFF, data_sptcutoff);
glLightf(*gl_lid, GL_CONSTANT_ATTENUATION, data_constantattenuation);
glLightf(*gl_lid, GL_LINEAR_ATTENUATION, data_linearattenuation);
glLightf(*gl_lid, GL_QUADRATIC_ATTENUATION, 0.0);
break;
} }
if (lptr->type != TLightAmbient) // restore matrix in case of headlight
{ if (theLight.IsHeadlight)
glEnable(*gl_lid);
(*gl_lid)++;
}
/* si la light etait une headlight alors restaure la matrice precedente */
if (lptr->HeadLight)
{ {
glPopMatrix(); glPopMatrix();
glMatrixMode(cur_matrix); glMatrixMode (aMatrixModeOld);
} }
glEnable (theLightGlId++);
} }
/*----------------------------------------------------------------------*/ /*----------------------------------------------------------------------*/
@ -1009,23 +932,23 @@ D = -[Px,Py,Pz] dot |Nx|
// Apply Lights // Apply Lights
{ {
int i; // setup lights
glLightModelfv (GL_LIGHT_MODEL_AMBIENT, THE_DEFAULT_AMBIENT);
// Switch off all lights GLenum aLightGlId = GL_LIGHT0;
for (i = GL_LIGHT0; i <= GL_LIGHT7; i++) for (OpenGl_ListOfLight::Iterator aLightIt (myLights);
glDisable(i); aLightIt.More(); aLightIt.Next())
glLightModelfv(GL_LIGHT_MODEL_AMBIENT, default_amb);
/* set les lights */
int gl_lid = GL_LIGHT0;
OpenGl_ListOfLight::Iterator itl(myLights);
for (; itl.More(); itl.Next())
{ {
const OpenGl_Light &alight = itl.Value(); bind_light (aLightIt.Value(), aLightGlId);
bind_light(&alight, &gl_lid); }
if (aLightGlId != GL_LIGHT0)
{
glEnable (GL_LIGHTING);
}
// switch off unused lights
for (; aLightGlId <= GL_LIGHT7; ++aLightGlId)
{
glDisable (aLightGlId);
} }
if (gl_lid != GL_LIGHT0) glEnable(GL_LIGHTING);
} }
// Apply InteriorShadingMethod // Apply InteriorShadingMethod

View File

@ -917,42 +917,24 @@ Standard_Boolean OpenGl_Workspace::UpdateRaytraceLightSources (const GLdouble th
{ {
myRaytraceSceneData.LightSources.clear(); myRaytraceSceneData.LightSources.clear();
OpenGl_ListOfLight::Iterator anItl (myView->LightList()); OpenGl_RTVec4f anAmbient (0.0f, 0.0f, 0.0f, 0.0f);
for (OpenGl_ListOfLight::Iterator anItl (myView->LightList());
OpenGl_RTVec4f aAmbient (0.f, 0.f, 0.f, 0.f); anItl.More(); anItl.Next())
for (; anItl.More(); anItl.Next())
{ {
const OpenGl_Light &aLight = anItl.Value(); const OpenGl_Light& aLight = anItl.Value();
if (aLight.Type == Visual3d_TOLS_AMBIENT)
if (aLight.type == TLightAmbient)
{ {
aAmbient += OpenGl_RTVec4f (aLight.col.rgb[0], anAmbient += OpenGl_RTVec4f (aLight.Color.r(), aLight.Color.g(), aLight.Color.b(), 0.0f);
aLight.col.rgb[1],
aLight.col.rgb[2],
0.f);
continue; continue;
} }
OpenGl_RTVec4f aDiffuse (aLight.col.rgb[0], OpenGl_RTVec4f aDiffuse (aLight.Color.r(), aLight.Color.g(), aLight.Color.b(), 1.0f);
aLight.col.rgb[1], OpenGl_RTVec4f aPosition (-aLight.Direction.x(), -aLight.Direction.y(), -aLight.Direction.z(), 0.0f);
aLight.col.rgb[2], if (aLight.Type != Visual3d_TOLS_DIRECTIONAL)
1.f);
OpenGl_RTVec4f aPosition (-aLight.dir[0],
-aLight.dir[1],
-aLight.dir[2],
0.f);
if (aLight.type != TLightDirectional)
{ {
aPosition = OpenGl_RTVec4f (aLight.pos[0], aPosition = OpenGl_RTVec4f (aLight.Position.x(), aLight.Position.y(), aLight.Position.z(), 1.0f);
aLight.pos[1],
aLight.pos[2],
1.f);
} }
if (aLight.IsHeadlight)
if (aLight.HeadLight)
{ {
aPosition = MatVecMult (theInvModelView, aPosition); aPosition = MatVecMult (theInvModelView, aPosition);
} }
@ -962,11 +944,11 @@ Standard_Boolean OpenGl_Workspace::UpdateRaytraceLightSources (const GLdouble th
if (myRaytraceSceneData.LightSources.size() > 0) if (myRaytraceSceneData.LightSources.size() > 0)
{ {
myRaytraceSceneData.LightSources.front().Ambient += aAmbient; myRaytraceSceneData.LightSources.front().Ambient += anAmbient;
} }
else else
{ {
myRaytraceSceneData.LightSources.push_back (OpenGl_RaytraceLight (OpenGl_RTVec4f (aAmbient.xyz(), -1.0f))); myRaytraceSceneData.LightSources.push_back (OpenGl_RaytraceLight (OpenGl_RTVec4f (anAmbient.rgb(), -1.0f)));
} }
cl_int anError = CL_SUCCESS; cl_int anError = CL_SUCCESS;

View File

@ -1,192 +1,79 @@
#define _OCC_MAX_LIGHTS_ 8 // This files includes definition of common uniform variables in OCCT GLSL programs
#define _OCC_MAX_CLIP_PLANES_ 8 #define THE_MAX_LIGHTS 8
#define THE_MAX_CLIP_PLANES 8
//! OCCT ambient light source.
const int occAmbientLight = 0;
//! OCCT directional light source.
const int occDirectLight = 1;
//! OCCT isotropic point light source.
const int occPointLight = 2;
//! OCCT spot light source.
const int occSpotLight = 3;
//! Parameters of OCCT light source.
struct occLightSource
{
//! Type of light source.
int Type;
//! Is light a headlight?
int Head;
//! Ambient intensity.
vec3 Ambient;
//! Diffuse intensity.
vec3 Diffuse;
//! Specular intensity.
vec3 Specular;
//! Position of light source.
vec3 Position;
//! Direction of the spot light.
vec3 SpotDirection;
//! Maximum spread angle of the spot light (in radians).
float SpotCutoff;
//! Attenuation of the spot light intensity (from 0 to 1).
float SpotExponent;
//! Const attenuation factor of positional light source.
float ConstAttenuation;
//! Linear attenuation factor of positional light source.
float LinearAttenuation;
};
//! Parameters of OCCT material.
struct occMaterialParams
{
//! Emission color.
vec4 Emission;
//! Ambient reflection.
vec4 Ambient;
//! Diffuse reflection.
vec4 Diffuse;
//! Specular reflection.
vec4 Specular;
//! Specular exponent.
float Shininess;
//! Transparency coefficient.
float Transparency;
};
//! OCCT view-space clipping plane.
const int occEquationCoordsView = 0;
//! OCCT world-space clipping plane.
const int occEquationCoordsWorld = 1;
//! Parameters of OCCT clipping plane.
struct occClipPlane
{
//! Plane equation.
vec4 Equation;
//! Equation space.
int Space;
};
#ifdef VERTEX_SHADER
/////////////////////////////////////////////////////////////////////
// OCCT vertex attributes
// Vertex attributes
// Note: At the moment, we just 'rename' the default OpenGL // Note: At the moment, we just 'rename' the default OpenGL
// vertex attributes from compatibility profile. In the next // vertex attributes from compatibility profile. In the next
// release old functionality will be removed from shader API. // release old functionality will be removed from shader API.
#ifdef VERTEX_SHADER
//! Vertex color. #define occColor gl_Color //!< Vertex color
#define occColor gl_Color #define occNormal gl_Normal //!< Normal coordinates
#define occVertex gl_Vertex //!< Vertex coordinates
//! Normal coordinates. #define occTexCoord gl_MultiTexCoord0 //!< Texture coordinates
#define occNormal gl_Normal
//! Vertex coordinates.
#define occVertex gl_Vertex
//! Texture coordinates.
#define occTexCoord gl_MultiTexCoord0
#endif #endif
///////////////////////////////////////////////////////////////////// // Matrix state
// OCCT matrix state uniform mat4 occWorldViewMatrix; //!< World-view matrix
uniform mat4 occProjectionMatrix; //!< Projection matrix
uniform mat4 occModelWorldMatrix; //!< Model-world matrix
//! World-view matrix. uniform mat4 occWorldViewMatrixInverse; //!< Inverse of the world-view matrix
uniform mat4 occWorldViewMatrix; uniform mat4 occProjectionMatrixInverse; //!< Inverse of the projection matrix
uniform mat4 occModelWorldMatrixInverse; //!< Inverse of the model-world matrix
//! Projection matrix. uniform mat4 occWorldViewMatrixTranspose; //!< Transpose of the world-view matrix
uniform mat4 occProjectionMatrix; uniform mat4 occProjectionMatrixTranspose; //!< Transpose of the projection matrix
uniform mat4 occModelWorldMatrixTranspose; //!< Transpose of the model-world matrix
//! Model-world matrix. uniform mat4 occWorldViewMatrixInverseTranspose; //!< Transpose of the inverse of the world-view matrix
uniform mat4 occModelWorldMatrix; uniform mat4 occProjectionMatrixInverseTranspose; //!< Transpose of the inverse of the projection matrix
uniform mat4 occModelWorldMatrixInverseTranspose; //!< Transpose of the inverse of the model-world matrix
//------------------------------------------------------- // light type enumeration
const int OccLightType_Direct = 1; //!< directional light source
const int OccLightType_Point = 2; //!< isotropic point light source
const int OccLightType_Spot = 3; //!< spot light source
//! Inverse of the world-view matrix. // Light sources
uniform mat4 occWorldViewMatrixInverse; uniform vec4 occLightAmbient; //!< Cumulative ambient color
uniform int occLightSourcesCount; //!< Total number of light sources
int occLight_Type (in int theId); //!< Type of light source
int occLight_IsHeadlight (in int theId); //!< Is light a headlight?
vec4 occLight_Diffuse (in int theId); //!< Diffuse intensity for specified light source
vec4 occLight_Specular (in int theId); //!< Specular intensity (currently - equals to diffuse intencity)
vec4 occLight_Position (in int theId); //!< Position of specified light source
vec4 occLight_SpotDirection (in int theId); //!< Direction of specified spot light source
float occLight_ConstAttenuation (in int theId); //!< Const attenuation factor of positional light source
float occLight_LinearAttenuation (in int theId); //!< Linear attenuation factor of positional light source
float occLight_SpotCutOff (in int theId); //!< Maximum spread angle of the spot light (in radians)
float occLight_SpotExponent (in int theId); //!< Attenuation of the spot light intensity (from 0 to 1)
//! Inverse of the projection matrix. // Front material properties accessors
uniform mat4 occProjectionMatrixInverse; vec4 occFrontMaterial_Emission(void); //!< Emission color
vec4 occFrontMaterial_Ambient(void); //!< Ambient reflection
vec4 occFrontMaterial_Diffuse(void); //!< Diffuse reflection
vec4 occFrontMaterial_Specular(void); //!< Specular reflection
float occFrontMaterial_Shininess(void); //!< Specular exponent
float occFrontMaterial_Transparency(void); //!< Transparency coefficient
//! Inverse of the model-world matrix. // Front material properties accessors
uniform mat4 occModelWorldMatrixInverse; vec4 occBackMaterial_Emission(void); //!< Emission color
vec4 occBackMaterial_Ambient(void); //!< Ambient reflection
vec4 occBackMaterial_Diffuse(void); //!< Diffuse reflection
vec4 occBackMaterial_Specular(void); //!< Specular reflection
float occBackMaterial_Shininess(void); //!< Specular exponent
float occBackMaterial_Transparency(void); //!< Transparency coefficient
//------------------------------------------------------- uniform int occDistinguishingMode; //!< Are front and back faces distinguished?
uniform int occTextureEnable; //!< Is texture enabled?
uniform sampler2D occActiveSampler; //!< Current active sampler
//! Transpose of the world-view matrix. // clipping planes state
uniform mat4 occWorldViewMatrixTranspose; const int OccEquationCoords_View = 0; //!< view-space clipping plane
const int OccEquationCoords_World = 1; //!< world-space clipping plane
//! Transpose of the projection matrix. //! Parameters of clipping planes
uniform mat4 occProjectionMatrixTranspose; uniform vec4 occClipPlaneEquations[THE_MAX_CLIP_PLANES];
uniform int occClipPlaneSpaces [THE_MAX_CLIP_PLANES];
//! Transpose of the model-world matrix.
uniform mat4 occModelWorldMatrixTranspose;
//-------------------------------------------------------
//! Transpose of the inverse of the world-view matrix.
uniform mat4 occWorldViewMatrixInverseTranspose;
//! Transpose of the inverse of the projection matrix.
uniform mat4 occProjectionMatrixInverseTranspose;
//! Transpose of the inverse of the model-world matrix.
uniform mat4 occModelWorldMatrixInverseTranspose;
/////////////////////////////////////////////////////////////////////
// OCCT light source state
//! Array of OCCT light sources.
uniform occLightSource occLightSources[_OCC_MAX_LIGHTS_];
//! Total number of OCCT light sources.
uniform int occLightSourcesCount;
/////////////////////////////////////////////////////////////////////
// OCCT material state
//! Parameters of OCCT back material.
uniform occMaterialParams occBackMaterial;
//! Parameters of OCCT front material.
uniform occMaterialParams occFrontMaterial;
//! Are front and back faces distinguished?
uniform int occDistinguishingMode;
//! Is texture enabled?
uniform int occTextureEnable;
//! Current active sampler.
uniform sampler2D occActiveSampler;
/////////////////////////////////////////////////////////////////////
// OCCT clipping planes state
uniform occClipPlane occClipPlanes[_OCC_MAX_CLIP_PLANES_];

View File

@ -0,0 +1,37 @@
// This file includes implementation of common functions and properties accessors
// arrays of light sources
uniform ivec2 occLightSourcesTypes[THE_MAX_LIGHTS]; //!< packed light sources types
uniform vec4 occLightSources[THE_MAX_LIGHTS * 4]; //!< packed light sources parameters
// light source properties accessors
int occLight_Type (in int theId) { return occLightSourcesTypes[theId].x; }
int occLight_IsHeadlight (in int theId) { return occLightSourcesTypes[theId].y; }
vec4 occLight_Diffuse (in int theId) { return occLightSources[theId * 4 + 0]; }
vec4 occLight_Specular (in int theId) { return occLightSources[theId * 4 + 0]; }
vec4 occLight_Position (in int theId) { return occLightSources[theId * 4 + 1]; }
vec4 occLight_SpotDirection (in int theId) { return occLightSources[theId * 4 + 2]; }
float occLight_ConstAttenuation (in int theId) { return occLightSources[theId * 4 + 3].x; }
float occLight_LinearAttenuation (in int theId) { return occLightSources[theId * 4 + 3].y; }
float occLight_SpotCutOff (in int theId) { return occLightSources[theId * 4 + 3].z; }
float occLight_SpotExponent (in int theId) { return occLightSources[theId * 4 + 3].w; }
// material state
uniform vec4 occFrontMaterial[5];
uniform vec4 occBackMaterial[5];
// front material properties accessors
vec4 occFrontMaterial_Emission(void) { return occFrontMaterial[0]; }
vec4 occFrontMaterial_Ambient(void) { return occFrontMaterial[1]; }
vec4 occFrontMaterial_Diffuse(void) { return occFrontMaterial[2]; }
vec4 occFrontMaterial_Specular(void) { return occFrontMaterial[3]; }
float occFrontMaterial_Shininess(void) { return occFrontMaterial[4].x; }
float occFrontMaterial_Transparency(void) { return occFrontMaterial[4].y; }
// back material properties accessors
vec4 occBackMaterial_Emission(void) { return occBackMaterial[0]; }
vec4 occBackMaterial_Ambient(void) { return occBackMaterial[1]; }
vec4 occBackMaterial_Diffuse(void) { return occBackMaterial[2]; }
vec4 occBackMaterial_Specular(void) { return occBackMaterial[3]; }
float occBackMaterial_Shininess(void) { return occBackMaterial[4].x; }
float occBackMaterial_Transparency(void) { return occBackMaterial[4].y; }

View File

@ -17,46 +17,22 @@
// purpose or non-infringement. Please see the License for the specific terms // purpose or non-infringement. Please see the License for the specific terms
// and conditions governing the rights and limitations under the License. // and conditions governing the rights and limitations under the License.
//! Direction to the viewer. varying vec3 View; //!< Direction to the viewer
varying vec3 View; varying vec3 Normal; //!< Vertex normal in view space
varying vec4 Position; //!< Vertex position in view space.
//! Vertex normal in view space. vec3 Ambient; //!< Ambient contribution of light sources
varying vec3 Normal; vec3 Diffuse; //!< Diffuse contribution of light sources
vec3 Specular; //!< Specular contribution of light sources
//! Vertex position in view space. //! Computes contribution of isotropic point light source
varying vec4 Position; void pointLight (in int theId,
//! Ambient contribution of light sources.
vec3 Ambient;
//! Diffuse contribution of light sources.
vec3 Diffuse;
//! Specular contribution of light sources.
vec3 Specular;
// =======================================================================
// function : AmbientLight
// purpose : Computes contribution of OCCT pure ambient light source
// =======================================================================
void AmbientLight (in int theIndex)
{
Ambient += occLightSources[theIndex].Ambient;
}
// =======================================================================
// function : PointLight
// purpose : Computes contribution of OCCT isotropic point light source
// =======================================================================
void PointLight (in int theIndex,
in vec3 theNormal, in vec3 theNormal,
in vec3 theView, in vec3 theView,
in vec3 thePoint) in vec3 thePoint)
{ {
vec3 aLight = occLightSources[theIndex].Position; vec3 aLight = occLight_Position (theId).xyz;
if (occLightSources[theIndex].Head == 0) if (occLight_IsHeadlight (theId) == 0)
{ {
aLight = vec3 (occWorldViewMatrix * occModelWorldMatrix * vec4 (aLight, 1.0)); aLight = vec3 (occWorldViewMatrix * occModelWorldMatrix * vec4 (aLight, 1.0));
} }
@ -64,107 +40,86 @@ void PointLight (in int theIndex,
float aDist = length (aLight); float aDist = length (aLight);
aLight = aLight * (1.0 / aDist); aLight = aLight * (1.0 / aDist);
float anAttenuation = 1.0 / (occLightSources[theIndex].ConstAttenuation + float anAtten = 1.0 / (occLight_ConstAttenuation (theId)
occLightSources[theIndex].LinearAttenuation * aDist); + occLight_LinearAttenuation (theId) * aDist);
vec3 aHalf = normalize (aLight + theView); vec3 aHalf = normalize (aLight + theView);
float aNdotL = max (0.0, dot (theNormal, aLight)); float aNdotL = max (0.0, dot (theNormal, aLight));
float aNdotH = max (0.0, dot (theNormal, aHalf)); float aNdotH = max (0.0, dot (theNormal, aHalf ));
float aSpecl = 0.0; float aSpecl = 0.0;
if (aNdotL > 0.0) if (aNdotL > 0.0)
{ {
aSpecl = pow (aNdotH, occFrontMaterial.Shininess); aSpecl = pow (aNdotH, occFrontMaterial_Shininess());
} }
Ambient += occLightSources[theIndex].Ambient * anAttenuation; Diffuse += occLight_Diffuse (theId).rgb * aNdotL * anAtten;
Diffuse += occLightSources[theIndex].Diffuse * aNdotL * anAttenuation; Specular += occLight_Specular (theId).rgb * aSpecl * anAtten;
Specular += occLightSources[theIndex].Specular * aSpecl * anAttenuation;
} }
// ======================================================================= //! Computes contribution of directional light source
// function : DirectionalLight void directionalLight (in int theId,
// purpose : Computes contribution of OCCT directional light source
// =======================================================================
void DirectionalLight (in int theIndex,
in vec3 theNormal, in vec3 theNormal,
in vec3 theView) in vec3 theView)
{ {
vec3 aLight = normalize (occLightSources[theIndex].Position); vec3 aLight = normalize (occLight_Position (theId).xyz);
if (occLight_IsHeadlight (theId) == 0)
if (occLightSources[theIndex].Head == 0)
{ {
aLight = vec3 (occWorldViewMatrix * occModelWorldMatrix * vec4 (aLight, 0.0)); aLight = vec3 (occWorldViewMatrix * occModelWorldMatrix * vec4 (aLight, 0.0));
} }
vec3 aHalf = normalize (aLight + theView); vec3 aHalf = normalize (aLight + theView);
float aNdotL = max (0.0, dot (theNormal, aLight)); float aNdotL = max (0.0, dot (theNormal, aLight));
float aNdotH = max (0.0, dot (theNormal, aHalf)); float aNdotH = max (0.0, dot (theNormal, aHalf ));
float aSpecl = 0.0; float aSpecl = 0.0;
if (aNdotL > 0.0) if (aNdotL > 0.0)
{ {
aSpecl = pow (aNdotH, occFrontMaterial.Shininess); aSpecl = pow (aNdotH, occFrontMaterial_Shininess());
} }
Ambient += occLightSources[theIndex].Ambient; Diffuse += occLight_Diffuse (theId).rgb * aNdotL;
Diffuse += occLightSources[theIndex].Diffuse * aNdotL; Specular += occLight_Specular (theId).rgb * aSpecl;
Specular += occLightSources[theIndex].Specular * aSpecl;
} }
// ======================================================================= //! Computes illumination from light sources
// function : ComputeLighting vec4 computeLighting (in vec3 theNormal,
// purpose : Computes illumination from OCCT light sources
// =======================================================================
vec4 ComputeLighting (in vec3 theNormal,
in vec3 theView, in vec3 theView,
in vec4 thePoint) in vec4 thePoint)
{ {
// Clear the light intensity accumulators // Clear the light intensity accumulators
Ambient = vec3 (0.0); Ambient = occLightAmbient.rgb;
Diffuse = vec3 (0.0); Diffuse = vec3 (0.0);
Specular = vec3 (0.0); Specular = vec3 (0.0);
vec3 aPoint = thePoint.xyz / thePoint.w; vec3 aPoint = thePoint.xyz / thePoint.w;
for (int anIndex = 0; anIndex < occLightSourcesCount; ++anIndex) for (int anIndex = 0; anIndex < occLightSourcesCount; ++anIndex)
{ {
occLightSource light = occLightSources[anIndex]; int aType = occLight_Type (anIndex);
if (aType == OccLightType_Direct)
if (light.Type == occAmbientLight)
{ {
AmbientLight (anIndex); directionalLight (anIndex, theNormal, theView);
}
else if (aType == OccLightType_Point)
{
pointLight (anIndex, theNormal, theView, aPoint);
}
else if (aType == OccLightType_Spot)
{
// Not implemented
} }
else if (light.Type == occDirectLight)
{
DirectionalLight (anIndex, theNormal, theView);
}
else if (light.Type == occPointLight)
{
PointLight (anIndex, theNormal, theView, aPoint);
}
else if (light.Type == occSpotLight)
{
/* Not implemented */
}
} }
return vec4 (Ambient, 1.0) * occFrontMaterial.Ambient + return vec4 (Ambient, 1.0) * occFrontMaterial_Ambient()
vec4 (Diffuse, 1.0) * occFrontMaterial.Diffuse + + vec4 (Diffuse, 1.0) * occFrontMaterial_Diffuse()
vec4 (Specular, 1.0) * occFrontMaterial.Specular; + vec4 (Specular, 1.0) * occFrontMaterial_Specular();
} }
// ======================================================================= //! Entry point to the Fragment Shader
// function : main
// purpose : Entry point to the fragment shader
// =======================================================================
void main() void main()
{ {
gl_FragColor = ComputeLighting (normalize (Normal), gl_FragColor = computeLighting (normalize (Normal),
normalize (View), normalize (View),
Position); Position);
} }

View File

@ -17,42 +17,27 @@
// purpose or non-infringement. Please see the License for the specific terms // purpose or non-infringement. Please see the License for the specific terms
// and conditions governing the rights and limitations under the License. // and conditions governing the rights and limitations under the License.
//! Direction to the viewer. varying vec3 View; //!< Direction to the viewer
varying vec3 View; varying vec3 Normal; //!< Vertex normal in view space
varying vec4 Position; //!< Vertex position in view space
//! Vertex normal in view space. //! Computes the normal in view space
varying vec3 Normal;
//! Vertex position in view space.
varying vec4 Position;
// =======================================================================
// function : TransformNormal
// purpose : Computes the normal in view space
// =======================================================================
vec3 TransformNormal (in vec3 theNormal) vec3 TransformNormal (in vec3 theNormal)
{ {
vec4 aResult = occWorldViewMatrixInverseTranspose * vec4 aResult = occWorldViewMatrixInverseTranspose
occModelWorldMatrixInverseTranspose * vec4 (theNormal, 0.0); * occModelWorldMatrixInverseTranspose
* vec4 (theNormal, 0.0);
return normalize (aResult.xyz); return normalize (aResult.xyz);
} }
// ======================================================================= //! Entry point to the Vertex Shader
// function : main
// purpose : Entry point to the vertex shader
// =======================================================================
void main() void main()
{ {
// Compute vertex position in the view space Position = occWorldViewMatrix * occModelWorldMatrix * occVertex; // position in the view space
Position = occWorldViewMatrix * occModelWorldMatrix * occVertex; Normal = TransformNormal (occNormal); // normal in the view space
// Compute vertex normal in the view space // Note: The specified view vector is absolutely correct only for the orthogonal projection.
Normal = TransformNormal (occNormal); // For perspective projection it will be approximate, but it is in good agreement with the OpenGL calculations.
// Note: The specified view vector is absolutely correct only for the orthogonal
// projection. For perspective projection it will be approximate, but it is in
// good agreement with the OpenGL calculations
View = vec3 (0.0, 0.0, 1.0); View = vec3 (0.0, 0.0, 1.0);
// Do fixed functionality vertex transform // Do fixed functionality vertex transform

View File

@ -106,6 +106,10 @@ is
---Level: Public ---Level: Public
---Purpose: returns true if the light is a headlight ---Purpose: returns true if the light is a headlight
SetHeadlight( me : mutable; theValue : Boolean from Standard ) is static;
---Level: Public
---Purpose: Setup headlight flag.
IsDisplayed( me ) returns Boolean from Standard; IsDisplayed( me ) returns Boolean from Standard;
---Level: Public ---Level: Public
---Purpose: Returns TRUE when a light representation is displayed ---Purpose: Returns TRUE when a light representation is displayed

View File

@ -114,6 +114,11 @@ Standard_Boolean V3d_Light::Headlight() const {
return MyLight->Headlight(); return MyLight->Headlight();
} }
void V3d_Light::SetHeadlight (const Standard_Boolean theValue)
{
MyLight->SetHeadlight (theValue);
}
void V3d_Light::SymetricPointOnSphere (const Handle(V3d_View)& aView, const Graphic3d_Vertex &Center, const Graphic3d_Vertex &aPoint, const Standard_Real Rayon, Standard_Real& X, Standard_Real& Y, Standard_Real& Z, Standard_Real& VX, Standard_Real& VY, Standard_Real& VZ ) { void V3d_Light::SymetricPointOnSphere (const Handle(V3d_View)& aView, const Graphic3d_Vertex &Center, const Graphic3d_Vertex &aPoint, const Standard_Real Rayon, Standard_Real& X, Standard_Real& Y, Standard_Real& Z, Standard_Real& VX, Standard_Real& VY, Standard_Real& VZ ) {
Standard_Real X0,Y0,Z0,XP,YP,ZP; Standard_Real X0,Y0,Z0,XP,YP,ZP;

View File

@ -42,7 +42,12 @@
#include <ViewerTest_DoubleMapIteratorOfDoubleMapOfInteractiveAndName.hxx> #include <ViewerTest_DoubleMapIteratorOfDoubleMapOfInteractiveAndName.hxx>
#include <Visual3d_View.hxx> #include <Visual3d_View.hxx>
#include <Visual3d_ViewManager.hxx> #include <Visual3d_ViewManager.hxx>
#include <V3d_AmbientLight.hxx>
#include <V3d_DirectionalLight.hxx>
#include <V3d_LayerMgr.hxx> #include <V3d_LayerMgr.hxx>
#include <V3d_LayerMgrPointer.hxx>
#include <V3d_PositionalLight.hxx>
#include <V3d_SpotLight.hxx>
#include <NCollection_DoubleMap.hxx> #include <NCollection_DoubleMap.hxx>
#include <NCollection_List.hxx> #include <NCollection_List.hxx>
#include <NCollection_Vector.hxx> #include <NCollection_Vector.hxx>
@ -61,8 +66,6 @@
#include <TColStd_HSequenceOfReal.hxx> #include <TColStd_HSequenceOfReal.hxx>
#include <TColgp_Array1OfPnt2d.hxx> #include <TColgp_Array1OfPnt2d.hxx>
#include <Visual3d_LayerItem.hxx> #include <Visual3d_LayerItem.hxx>
#include <V3d_LayerMgr.hxx>
#include <V3d_LayerMgrPointer.hxx>
#include <Aspect_TypeOfLine.hxx> #include <Aspect_TypeOfLine.hxx>
#include <Image_Diff.hxx> #include <Image_Diff.hxx>
#include <Aspect_DisplayConnection.hxx> #include <Aspect_DisplayConnection.hxx>
@ -5352,6 +5355,449 @@ static int VDefaults (Draw_Interpretor& theDi,
return 0; return 0;
} }
//! Auxiliary method
inline void addLight (const Handle(V3d_Light)& theLightNew,
const Standard_Boolean theIsGlobal)
{
if (theLightNew.IsNull())
{
return;
}
if (theIsGlobal)
{
ViewerTest::GetViewerFromContext()->SetLightOn (theLightNew);
}
else
{
ViewerTest::CurrentView()->SetLightOn (theLightNew);
}
}
//! Auxiliary method
inline Standard_Integer getLightId (const TCollection_AsciiString& theArgNext)
{
TCollection_AsciiString anArgNextCase (theArgNext);
anArgNextCase.UpperCase();
if (anArgNextCase.Length() > 5
&& anArgNextCase.SubString (1, 5).IsEqual ("LIGHT"))
{
return theArgNext.SubString (6, theArgNext.Length()).IntegerValue();
}
else
{
return theArgNext.IntegerValue();
}
}
//===============================================================================================
//function : VLight
//purpose :
//===============================================================================================
static int VLight (Draw_Interpretor& theDi,
Standard_Integer theArgsNb,
const char** theArgVec)
{
Handle(V3d_View) aView = ViewerTest::CurrentView();
Handle(V3d_Viewer) aViewer = ViewerTest::GetViewerFromContext();
if (aView.IsNull()
|| aViewer.IsNull())
{
std::cerr << "No active viewer!\n";
return 1;
}
Standard_Real anXYZ[3];
Quantity_Coefficient anAtten[2];
if (theArgsNb < 2)
{
// print lights info
Standard_Integer aLightId = 0;
for (aView->InitActiveLights(); aView->MoreActiveLights(); aView->NextActiveLights(), ++aLightId)
{
Handle(V3d_Light) aLight = aView->ActiveLight();
const Quantity_Color aColor = aLight->Color();
theDi << "Light" << aLightId << "\n";
switch (aLight->Type())
{
case V3d_AMBIENT:
{
theDi << " Type: Ambient\n";
break;
}
case V3d_DIRECTIONAL:
{
Handle(V3d_DirectionalLight) aLightDir = Handle(V3d_DirectionalLight)::DownCast (aLight);
theDi << " Type: Directional\n";
theDi << " Headlight: " << (aLight->Headlight() ? "TRUE" : "FALSE") << "\n";
if (!aLightDir.IsNull())
{
aLightDir->Position (anXYZ[0], anXYZ[1], anXYZ[2]);
theDi << " Position: " << anXYZ[0] << ", " << anXYZ[1] << ", " << anXYZ[2] << "\n";
aLightDir->Direction (anXYZ[0], anXYZ[1], anXYZ[2]);
theDi << " Direction: " << anXYZ[0] << ", " << anXYZ[1] << ", " << anXYZ[2] << "\n";
}
break;
}
case V3d_POSITIONAL:
{
Handle(V3d_PositionalLight) aLightPos = Handle(V3d_PositionalLight)::DownCast (aLight);
theDi << " Type: Positional\n";
theDi << " Headlight: " << (aLight->Headlight() ? "TRUE" : "FALSE") << "\n";
if (!aLightPos.IsNull())
{
aLightPos->Position (anXYZ[0], anXYZ[1], anXYZ[2]);
theDi << " Position: " << anXYZ[0] << ", " << anXYZ[1] << ", " << anXYZ[2] << "\n";
aLightPos->Attenuation (anAtten[0], anAtten[1]);
theDi << " Atten.: " << anAtten[0] << " " << anAtten[1] << "\n";
}
break;
}
case V3d_SPOT:
{
Handle(V3d_SpotLight) aLightSpot = Handle(V3d_SpotLight)::DownCast (aLight);
theDi << " Type: Spot\n";
theDi << " Headlight: " << (aLight->Headlight() ? "TRUE" : "FALSE") << "\n";
if (!aLightSpot.IsNull())
{
aLightSpot->Position (anXYZ[0], anXYZ[1], anXYZ[2]);
theDi << " Position: " << anXYZ[0] << ", " << anXYZ[1] << ", " << anXYZ[2] << "\n";
aLightSpot->Direction (anXYZ[0], anXYZ[1], anXYZ[2]);
theDi << " Direction: " << anXYZ[0] << ", " << anXYZ[1] << ", " << anXYZ[2] << "\n";
aLightSpot->Attenuation (anAtten[0], anAtten[1]);
theDi << " Atten.: " << anAtten[0] << " " << anAtten[1] << "\n";
theDi << " Angle: " << (aLightSpot->Angle() * 180.0 / M_PI) << "\n";
theDi << " Exponent: " << aLightSpot->Concentration() << "\n";
}
break;
}
default:
{
theDi << " Type: UNKNOWN\n";
break;
}
}
theDi << " Color: " << aColor.Red() << ", " << aColor.Green() << ", " << aColor.Blue() << "\n";
}
}
Handle(V3d_Light) aLightNew;
Handle(V3d_Light) aLightOld;
Standard_Boolean isGlobal = Standard_True;
Standard_Boolean toCreate = Standard_False;
for (Standard_Integer anArgIt = 1; anArgIt < theArgsNb; ++anArgIt)
{
Handle(V3d_Light) aLightCurr = aLightNew.IsNull() ? aLightOld : aLightNew;
Handle(V3d_AmbientLight) aLightAmb = Handle(V3d_AmbientLight) ::DownCast (aLightCurr);
Handle(V3d_DirectionalLight) aLightDir = Handle(V3d_DirectionalLight)::DownCast (aLightCurr);
Handle(V3d_PositionalLight) aLightPos = Handle(V3d_PositionalLight) ::DownCast (aLightCurr);
Handle(V3d_SpotLight) aLightSpot = Handle(V3d_SpotLight) ::DownCast (aLightCurr);
TCollection_AsciiString aName, aValue;
const TCollection_AsciiString anArg (theArgVec[anArgIt]);
TCollection_AsciiString anArgCase (anArg);
anArgCase.UpperCase();
if (anArgCase.IsEqual ("NEW")
|| anArgCase.IsEqual ("ADD")
|| anArgCase.IsEqual ("CREATE"))
{
toCreate = Standard_True;
}
else if (anArgCase.IsEqual ("GLOB")
|| anArgCase.IsEqual ("GLOBAL"))
{
isGlobal = Standard_True;
}
else if (anArgCase.IsEqual ("LOC")
|| anArgCase.IsEqual ("LOCAL"))
{
isGlobal = Standard_False;
}
else if (anArgCase.IsEqual ("AMB")
|| anArgCase.IsEqual ("AMBIENT")
|| anArgCase.IsEqual ("AMBLIGHT"))
{
addLight (aLightNew, isGlobal);
if (!toCreate)
{
std::cerr << "Wrong syntax at argument '" << anArg << "'!\n";
return 1;
}
toCreate = Standard_False;
aLightNew = new V3d_AmbientLight (aViewer);
}
else if (anArgCase.IsEqual ("DIRECTIONAL")
|| anArgCase.IsEqual ("DIRLIGHT"))
{
addLight (aLightNew, isGlobal);
if (!toCreate)
{
std::cerr << "Wrong syntax at argument '" << anArg << "'!\n";
return 1;
}
toCreate = Standard_False;
aLightNew = new V3d_DirectionalLight (aViewer);
}
else if (anArgCase.IsEqual ("SPOT")
|| anArgCase.IsEqual ("SPOTLIGHT"))
{
addLight (aLightNew, isGlobal);
if (!toCreate)
{
std::cerr << "Wrong syntax at argument '" << anArg << "'!\n";
return 1;
}
toCreate = Standard_False;
aLightNew = new V3d_SpotLight (aViewer, 0.0, 0.0, 0.0);
}
else if (anArgCase.IsEqual ("POSLIGHT")
|| anArgCase.IsEqual ("POSITIONAL"))
{
addLight (aLightNew, isGlobal);
if (!toCreate)
{
std::cerr << "Wrong syntax at argument '" << anArg << "'!\n";
return 1;
}
toCreate = Standard_False;
aLightNew = new V3d_PositionalLight (aViewer, 0.0, 0.0, 0.0);
}
else if (anArgCase.IsEqual ("CHANGE"))
{
addLight (aLightNew, isGlobal);
aLightNew.Nullify();
if (++anArgIt >= theArgsNb)
{
std::cerr << "Wrong syntax at argument '" << anArg << "'!\n";
return 1;
}
const Standard_Integer aLightId = getLightId (theArgVec[anArgIt]);
Standard_Integer aLightIt = 0;
for (aView->InitActiveLights(); aView->MoreActiveLights(); aView->NextActiveLights(), ++aLightIt)
{
if (aLightIt == aLightId)
{
aLightOld = aView->ActiveLight();
break;
}
}
if (aLightOld.IsNull())
{
std::cerr << "Light " << theArgVec[anArgIt] << " is undefined!\n";
return 1;
}
}
else if (anArgCase.IsEqual ("DEL")
|| anArgCase.IsEqual ("DELETE"))
{
Handle(V3d_Light) aLightDel;
if (++anArgIt >= theArgsNb)
{
std::cerr << "Wrong syntax at argument '" << anArg << "'!\n";
return 1;
}
const TCollection_AsciiString anArgNext (theArgVec[anArgIt]);
const Standard_Integer aLightDelId = getLightId (theArgVec[anArgIt]);
Standard_Integer aLightIt = 0;
for (aView->InitActiveLights(); aView->MoreActiveLights(); aView->NextActiveLights(), ++aLightIt)
{
aLightDel = aView->ActiveLight();
if (aLightIt == aLightDelId)
{
break;
}
}
if (!aLightDel.IsNull())
{
aViewer->DelLight (aLightDel);
}
}
else if (anArgCase.IsEqual ("COLOR")
|| anArgCase.IsEqual ("COLOUR"))
{
if (++anArgIt >= theArgsNb)
{
std::cerr << "Wrong syntax at argument '" << anArg << "'!\n";
return 1;
}
TCollection_AsciiString anArgNext (theArgVec[anArgIt]);
anArgNext.UpperCase();
const Quantity_Color aColor = ViewerTest::GetColorFromName (anArgNext.ToCString());
if (!aLightCurr.IsNull())
{
aLightCurr->SetColor (aColor);
}
}
else if (anArgCase.IsEqual ("POS")
|| anArgCase.IsEqual ("POSITION"))
{
if ((anArgIt + 3) >= theArgsNb)
{
std::cerr << "Wrong syntax at argument '" << anArg << "'!\n";
return 1;
}
anXYZ[0] = Atof (theArgVec[++anArgIt]);
anXYZ[1] = Atof (theArgVec[++anArgIt]);
anXYZ[2] = Atof (theArgVec[++anArgIt]);
if (!aLightDir.IsNull())
{
aLightDir->SetPosition (anXYZ[0], anXYZ[1], anXYZ[2]);
}
else if (!aLightPos.IsNull())
{
aLightPos->SetPosition (anXYZ[0], anXYZ[1], anXYZ[2]);
}
else if (!aLightSpot.IsNull())
{
aLightSpot->SetPosition (anXYZ[0], anXYZ[1], anXYZ[2]);
}
else
{
std::cerr << "Wrong syntax at argument '" << anArg << "'!\n";
return 1;
}
}
else if (anArgCase.IsEqual ("DIR")
|| anArgCase.IsEqual ("DIRECTION"))
{
if ((anArgIt + 3) >= theArgsNb)
{
std::cerr << "Wrong syntax at argument '" << anArg << "'!\n";
return 1;
}
anXYZ[0] = Atof (theArgVec[++anArgIt]);
anXYZ[1] = Atof (theArgVec[++anArgIt]);
anXYZ[2] = Atof (theArgVec[++anArgIt]);
if (!aLightDir.IsNull())
{
aLightDir->SetDirection (anXYZ[0], anXYZ[1], anXYZ[2]);
}
else if (!aLightSpot.IsNull())
{
aLightSpot->SetDirection (anXYZ[0], anXYZ[1], anXYZ[2]);
}
else
{
std::cerr << "Wrong syntax at argument '" << anArg << "'!\n";
return 1;
}
}
else if (anArgCase.IsEqual ("CONSTATTEN")
|| anArgCase.IsEqual ("CONSTATTENUATION"))
{
if (++anArgIt >= theArgsNb)
{
std::cerr << "Wrong syntax at argument '" << anArg << "'!\n";
return 1;
}
if (!aLightPos.IsNull())
{
aLightPos->Attenuation (anAtten[0], anAtten[1]);
anAtten[0] = Atof (theArgVec[anArgIt]);
aLightPos->SetAttenuation (anAtten[0], anAtten[1]);
}
else if (!aLightSpot.IsNull())
{
aLightSpot->Attenuation (anAtten[0], anAtten[1]);
anAtten[0] = Atof (theArgVec[anArgIt]);
aLightSpot->SetAttenuation (anAtten[0], anAtten[1]);
}
else
{
std::cerr << "Wrong syntax at argument '" << anArg << "'!\n";
return 1;
}
}
else if (anArgCase.IsEqual ("LINATTEN")
|| anArgCase.IsEqual ("LINEARATTEN")
|| anArgCase.IsEqual ("LINEARATTENUATION"))
{
if (++anArgIt >= theArgsNb)
{
std::cerr << "Wrong syntax at argument '" << anArg << "'!\n";
return 1;
}
if (!aLightPos.IsNull())
{
aLightPos->Attenuation (anAtten[0], anAtten[1]);
anAtten[1] = Atof (theArgVec[anArgIt]);
aLightPos->SetAttenuation (anAtten[0], anAtten[1]);
}
else if (!aLightSpot.IsNull())
{
aLightSpot->Attenuation (anAtten[0], anAtten[1]);
anAtten[1] = Atof (theArgVec[anArgIt]);
aLightSpot->SetAttenuation (anAtten[0], anAtten[1]);
}
else
{
std::cerr << "Wrong syntax at argument '" << anArg << "'!\n";
return 1;
}
}
else if (anArgCase.IsEqual ("EXP")
|| anArgCase.IsEqual ("EXPONENT")
|| anArgCase.IsEqual ("SPOTEXP")
|| anArgCase.IsEqual ("SPOTEXPONENT"))
{
if (++anArgIt >= theArgsNb)
{
std::cerr << "Wrong syntax at argument '" << anArg << "'!\n";
return 1;
}
if (!aLightSpot.IsNull())
{
aLightSpot->SetConcentration (Atof (theArgVec[anArgIt]));
}
else
{
std::cerr << "Wrong syntax at argument '" << anArg << "'!\n";
return 1;
}
}
else if (anArgCase.IsEqual ("HEAD")
|| anArgCase.IsEqual ("HEADLIGHT"))
{
if (++anArgIt >= theArgsNb)
{
std::cerr << "Wrong syntax at argument '" << anArg << "'!\n";
return 1;
}
if (aLightAmb.IsNull()
&& !aLightCurr.IsNull())
{
aLightCurr->SetHeadlight (Draw::Atoi (theArgVec[anArgIt]) != 0);
}
else
{
std::cerr << "Wrong syntax at argument '" << anArg << "'!\n";
return 1;
}
}
else
{
std::cerr << "Warning: unknown argument '" << anArg << "'\n";
}
}
addLight (aLightNew, isGlobal);
aViewer->UpdateLights();
return 0;
}
//============================================================================== //==============================================================================
//function : VClInfo //function : VClInfo
//purpose : Prints info about active OpenCL device //purpose : Prints info about active OpenCL device
@ -5749,6 +6195,13 @@ void ViewerTest::ViewerCommands(Draw_Interpretor& theCommands)
theCommands.Add("vdefaults", theCommands.Add("vdefaults",
"vdefaults [absDefl=value] [devCoeff=value] [angDefl=value]", "vdefaults [absDefl=value] [devCoeff=value] [angDefl=value]",
__FILE__, VDefaults, group); __FILE__, VDefaults, group);
theCommands.Add("vlight",
"vlight [add|new {amb}ient|directional|{spot}light|positional]"
"\n\t\t: [{del}ete|change lightId] [local|global]"
"\n\t\t: [{pos}ition X Y Z] [color colorName] [{head}light 0|1]"
"\n\t\t: [{constAtten}uation value] [{linearAtten}uation value]"
"\n\t\t: [angle angleDeg] [{spotexp}onent value]",
__FILE__, VLight, group);
theCommands.Add("vraytrace", theCommands.Add("vraytrace",
"vraytrace 0|1", "vraytrace 0|1",
__FILE__,VRaytrace,group); __FILE__,VRaytrace,group);

View File

@ -17,7 +17,6 @@
-- purpose or non-infringement. Please see the License for the specific terms -- purpose or non-infringement. Please see the License for the specific terms
-- and conditions governing the rights and limitations under the License. -- and conditions governing the rights and limitations under the License.
class Light from Visual3d inherits TShared class Light from Visual3d inherits TShared
---Version: ---Version:
@ -43,17 +42,15 @@ class Light from Visual3d inherits TShared
uses uses
Color from Quantity, Color from Quantity,
CLight from Graphic3d,
CLight from Graphic3d, Vector from Graphic3d,
Vector from Graphic3d, Vertex from Graphic3d,
Vertex from Graphic3d, TypeOfLightSource from Visual3d
TypeOfLightSource from Visual3d
raises raises
LightDefinitionError from Visual3d LightDefinitionError from Visual3d
is is
@ -207,12 +204,16 @@ is
-- Category: Inquire methods -- Category: Inquire methods
---------------------------- ----------------------------
Headlight ( me ) Headlight ( me )
returns Boolean from Standard is static; returns Boolean from Standard is static;
---Level: Public ---Level: Public
---Purpose: Returns the headlight state of the light <me> ---Purpose: Returns the headlight state of the light <me>
---Category: Inquire methods ---Category: Inquire methods
SetHeadlight( me : mutable; theValue : Boolean from Standard ) is static;
---Level: Public
---Purpose: Setup headlight flag.
Color ( me ) Color ( me )
returns Color from Quantity is static; returns Color from Quantity is static;
---Level: Public ---Level: Public
@ -279,6 +280,14 @@ is
-- if the type of the light is not TOLS_SPOT. -- if the type of the light is not TOLS_SPOT.
raises LightDefinitionError is static; raises LightDefinitionError is static;
CLight ( me )
returns CLight from Graphic3d
is static;
---C++: return const &
---Level: Public
---Purpose: Returns the light defintion.
---Category: Inquire methods
-------------------------- --------------------------
-- Category: Class methods -- Category: Class methods
-------------------------- --------------------------
@ -309,32 +318,12 @@ is
-- spot light spread angle. -- spot light spread angle.
---Category: Private methods ---Category: Private methods
-- --
fields fields
-- -- the associated C structure
-- Class : Visual3d_Light myCLight : CLight from Graphic3d;
--
-- Purpose : Declaration of variables specific to light sources
--
-- Reminder : A light source is defined by:
-- - its type
-- - its colour
-- - the attenuation factor ( positional and spot only)
-- - its angle ( spot only )
-- - its concentration ( spot only )
-- - its direction ( directional and spot only )
-- - its position ( positional and spot only )
--
-- It is actived in a context of view.
--
-- the type
MyType : TypeOfLightSource from Visual3d;
-- the associated C structure
MyCLight : CLight from Graphic3d;
friends friends

View File

@ -16,509 +16,378 @@
// purpose or non-infringement. Please see the License for the specific terms // purpose or non-infringement. Please see the License for the specific terms
// and conditions governing the rights and limitations under the License. // and conditions governing the rights and limitations under the License.
/***********************************************************************
FUNCTION :
----------
File Visual3d_Light :
Declaration of variables specific to light sources
NOTES:
----------
A light source is defined by :
- type
- color
- reduction factors ( for positional and spot only )
- its angle ( for spot only )
- its concentration ( for spot only )
- its direction ( directional and spot only )
- its position ( positional and spot only )
It is active in a view, in the associated context.
ATTENTION:
----------
- AngleCone is given in radian [Pex] while OpenGl works in
degreees. The limits for Pex are [0,PI] while for OpenGl this is [0,90].
- Two reduction factors are used with Pex while OpenGl uses three.
- The ereduction factors have range [0.0,1.0] for Pex and
for OpenGl the range is [0.0,n]
- The concentration varies from [0.,1.0] for Pex to [0,128] for OpenGl.
************************************************************************/
/*----------------------------------------------------------------------*/
/*
* Includes
*/
#include <Visual3d_Light.ixx> #include <Visual3d_Light.ixx>
#include <Graphic3d_GraphicDriver.hxx> #include <Graphic3d_GraphicDriver.hxx>
/*----------------------------------------------------------------------*/ // =======================================================================
// function : Visual3d_Light
Visual3d_Light::Visual3d_Light (): // purpose :
MyType (Visual3d_TOLS_AMBIENT) { // =======================================================================
Visual3d_Light::Visual3d_Light()
MyCLight.WsId = -1; {
MyCLight.ViewId = 0; /* not used */ myCLight.Type = Visual3d_TOLS_AMBIENT;
MyCLight.LightType = int (MyType);
MyCLight.Headlight = 0;
Quantity_Color White (Quantity_NOC_WHITE);
MyCLight.Color.r = float (White.Red ());
MyCLight.Color.g = float (White.Green ());
MyCLight.Color.b = float (White.Blue ());
MyCLight.LightId =
Graphic3d_GraphicDriver::Light (MyCLight, Standard_False);
} }
/*----------------------------------------------------------------------*/ // =======================================================================
// function : Visual3d_Light
Visual3d_Light::Visual3d_Light (const Quantity_Color& Color): // purpose :
MyType (Visual3d_TOLS_AMBIENT) { // =======================================================================
Visual3d_Light::Visual3d_Light (const Quantity_Color& theColor)
MyCLight.WsId = -1; {
MyCLight.ViewId = 0; /* not used */ myCLight.Type = Visual3d_TOLS_AMBIENT;
MyCLight.LightType = int (MyType); myCLight.Color.r() = Standard_ShortReal (theColor.Red());
MyCLight.Headlight = 0; myCLight.Color.g() = Standard_ShortReal (theColor.Green());
myCLight.Color.b() = Standard_ShortReal (theColor.Blue());
MyCLight.Color.r = float (Color.Red ());
MyCLight.Color.g = float (Color.Green ());
MyCLight.Color.b = float (Color.Blue ());
MyCLight.LightId =
Graphic3d_GraphicDriver::Light (MyCLight, Standard_False);
} }
/*----------------------------------------------------------------------*/ // =======================================================================
// function : Visual3d_Light
Visual3d_Light::Visual3d_Light(const Quantity_Color& Color,const Graphic3d_Vector& Direction,const Standard_Boolean Headlight): MyType (Visual3d_TOLS_DIRECTIONAL) { // purpose :
// =======================================================================
if (Direction.LengthZero ()) Visual3d_Light::Visual3d_Light (const Quantity_Color& theColor,
Visual3d_LightDefinitionError::Raise const Graphic3d_Vector& theDir,
("Bad value for LightDirection"); const Standard_Boolean theIsHeadlight)
{
MyCLight.WsId = -1; Visual3d_LightDefinitionError_Raise_if (theDir.LengthZero(),
MyCLight.ViewId = 0; /* not used */ "Bad value for LightDirection");
MyCLight.LightType = int (MyType); myCLight.Type = Visual3d_TOLS_DIRECTIONAL;
MyCLight.Headlight = Headlight? 1:0; myCLight.IsHeadlight = theIsHeadlight;
myCLight.Color.r() = Standard_ShortReal (theColor.Red());
Standard_Real Norme, X, Y, Z; myCLight.Color.g() = Standard_ShortReal (theColor.Green());
myCLight.Color.b() = Standard_ShortReal (theColor.Blue());
Color.Values (X, Y, Z, Quantity_TOC_RGB);
MyCLight.Color.r = float (X);
MyCLight.Color.g = float (Y);
MyCLight.Color.b = float (Z);
Direction.Coord (X, Y, Z);
Norme = Sqrt (X*X+Y*Y+Z*Z);
// Direction.LengthZero () == Standard_False
MyCLight.Direction.x = float (X/Norme);
MyCLight.Direction.y = float (Y/Norme);
MyCLight.Direction.z = float (Z/Norme);
MyCLight.LightId =
Graphic3d_GraphicDriver::Light (MyCLight, Standard_False);
Standard_Real X, Y, Z;
theDir.Coord (X, Y, Z);
const Standard_Real aNorm = Sqrt (X * X + Y * Y + Z * Z);
myCLight.Direction.x() = Standard_ShortReal (X / aNorm);
myCLight.Direction.y() = Standard_ShortReal (Y / aNorm);
myCLight.Direction.z() = Standard_ShortReal (Z / aNorm);
} }
/*----------------------------------------------------------------------*/ // =======================================================================
// function : Visual3d_Light
Visual3d_Light::Visual3d_Light (const Quantity_Color& Color, const Graphic3d_Vertex& Position, const Standard_Real Fact1, const Standard_Real Fact2): // purpose :
MyType (Visual3d_TOLS_POSITIONAL) { // =======================================================================
Visual3d_Light::Visual3d_Light (const Quantity_Color& theColor,
if ( (Fact1 == 0.0) && (Fact2 == 0.0) ) const Graphic3d_Vertex& thePos,
Visual3d_LightDefinitionError::Raise const Standard_Real theFact1,
("Bad value for LightAttenuation"); const Standard_Real theFact2)
{
if ( (Fact1 < 0.0) || (Fact1 > 1.0) ) Visual3d_LightDefinitionError_Raise_if ((theFact1 == 0.0 && theFact2 == 0.0)
Visual3d_LightDefinitionError::Raise || (theFact1 < 0.0 || theFact1 > 1.0)
("Bad value for LightAttenuation"); || (theFact2 < 0.0 || theFact2 > 1.0),
"Bad value for LightAttenuation");
if ( (Fact2 < 0.0) || (Fact2 > 1.0) ) myCLight.Type = Visual3d_TOLS_POSITIONAL;
Visual3d_LightDefinitionError::Raise myCLight.IsHeadlight = Standard_False;
("Bad value for LightAttenuation"); myCLight.Color.r() = Standard_ShortReal (theColor.Red());
myCLight.Color.g() = Standard_ShortReal (theColor.Green());
MyCLight.WsId = -1; myCLight.Color.b() = Standard_ShortReal (theColor.Blue());
MyCLight.ViewId = 0; /* not used */ myCLight.Position.x() = Standard_ShortReal (thePos.X());
MyCLight.LightType = int (MyType); myCLight.Position.y() = Standard_ShortReal (thePos.Y());
MyCLight.Headlight = 0; myCLight.Position.z() = Standard_ShortReal (thePos.Z());
myCLight.ChangeConstAttenuation() = Standard_ShortReal (theFact1);
MyCLight.Color.r = float (Color.Red ()); myCLight.ChangeLinearAttenuation() = Standard_ShortReal (theFact2);
MyCLight.Color.g = float (Color.Green ());
MyCLight.Color.b = float (Color.Blue ());
MyCLight.Position.x = float (Position.X ());
MyCLight.Position.y = float (Position.Y ());
MyCLight.Position.z = float (Position.Z ());
MyCLight.Attenuation[0] = float (Fact1);
MyCLight.Attenuation[1] = float (Fact2);
MyCLight.LightId =
Graphic3d_GraphicDriver::Light (MyCLight, Standard_False);
} }
/*----------------------------------------------------------------------*/ // =======================================================================
// function : Visual3d_Light
// purpose :
// =======================================================================
Visual3d_Light::Visual3d_Light (const Quantity_Color& theColor,
const Graphic3d_Vertex& thePos,
const Graphic3d_Vector& theDir,
const Standard_Real theConcentration,
const Standard_Real theFact1,
const Standard_Real theFact2,
const Standard_Real theAngleCone)
{
Visual3d_LightDefinitionError_Raise_if (theDir.LengthZero(),
"Bad value for LightDirection");
Visual3d_LightDefinitionError_Raise_if (theConcentration < 0.0 || theConcentration > 1.0,
"Bad value for LightConcentration");
Visual3d_LightDefinitionError_Raise_if ((theFact1 == 0.0 && theFact2 == 0.0)
|| (theFact1 < 0.0 || theFact1 > 1.0)
|| (theFact2 < 0.0 || theFact2 > 1.0),
"Bad value for LightAttenuation");
Visual3d_LightDefinitionError_Raise_if (!Visual3d_Light::IsValid (theAngleCone),
"Bad value for LightAngle");
myCLight.Type = Visual3d_TOLS_SPOT;
myCLight.IsHeadlight = Standard_False;
myCLight.Color.r() = Standard_ShortReal (theColor.Red());
myCLight.Color.g() = Standard_ShortReal (theColor.Green());
myCLight.Color.b() = Standard_ShortReal (theColor.Blue());
myCLight.Position.x() = Standard_ShortReal (thePos.X());
myCLight.Position.y() = Standard_ShortReal (thePos.Y());
myCLight.Position.z() = Standard_ShortReal (thePos.Z());
Visual3d_Light::Visual3d_Light (const Quantity_Color& Color, const Graphic3d_Vertex& Position, const Graphic3d_Vector& Direction, const Standard_Real Concentration, const Standard_Real Fact1, const Standard_Real Fact2, const Standard_Real AngleCone): Standard_Real X, Y, Z;
MyType (Visual3d_TOLS_SPOT) { theDir.Coord (X, Y, Z);
myCLight.Direction.x() = Standard_ShortReal (X);
if (Direction.LengthZero ()) myCLight.Direction.y() = Standard_ShortReal (Y);
Visual3d_LightDefinitionError::Raise myCLight.Direction.z() = Standard_ShortReal (Z);
("Bad value for LightDirection");
if ( (Concentration < 0.0) || (Concentration > 1.0) )
Visual3d_LightDefinitionError::Raise
("Bad value for LightConcentration");
if ( (Fact1 == 0.0) && (Fact2 == 0.0) )
Visual3d_LightDefinitionError::Raise
("Bad value for LightAttenuation");
if ( (Fact1 < 0.0) || (Fact1 > 1.0) )
Visual3d_LightDefinitionError::Raise
("Bad value for LightAttenuation");
if ( (Fact2 < 0.0) || (Fact2 > 1.0) )
Visual3d_LightDefinitionError::Raise
("Bad value for LightAttenuation");
if (Visual3d_Light::IsValid (AngleCone)) {
MyCLight.WsId = -1;
MyCLight.ViewId = 0; /* not used */
MyCLight.LightType = int (MyType);
MyCLight.Headlight = 0;
Standard_Real X, Y, Z;
Color.Values (X, Y, Z, Quantity_TOC_RGB);
MyCLight.Color.r = float (X);
MyCLight.Color.g = float (Y);
MyCLight.Color.b = float (Z);
Position.Coord (X, Y, Z);
MyCLight.Position.x = float (X);
MyCLight.Position.y = float (Y);
MyCLight.Position.z = float (Z);
Direction.Coord (X, Y, Z);
MyCLight.Direction.x = float (X);
MyCLight.Direction.y = float (Y);
MyCLight.Direction.z = float (Z);
MyCLight.Concentration = float (Concentration);
MyCLight.Attenuation[0] = float (Fact1);
MyCLight.Attenuation[1] = float (Fact2);
MyCLight.Angle = float (AngleCone);
MyCLight.LightId =
Graphic3d_GraphicDriver::Light (MyCLight, Standard_False);
}
else
Visual3d_LightDefinitionError::Raise
("Bad value for LightAngle");
myCLight.ChangeConcentration() = Standard_ShortReal (theConcentration);
myCLight.ChangeConstAttenuation() = Standard_ShortReal (theFact1);
myCLight.ChangeLinearAttenuation() = Standard_ShortReal (theFact2);
myCLight.ChangeAngle() = Standard_ShortReal (theAngleCone);
} }
/*----------------------------------------------------------------------*/ // =======================================================================
// function : Color
Quantity_Color Visual3d_Light::Color () const { // purpose :
// =======================================================================
Quantity_Color AColor (Standard_Real (MyCLight.Color.r), Quantity_Color Visual3d_Light::Color() const
Standard_Real (MyCLight.Color.g), {
Standard_Real (MyCLight.Color.b), return Quantity_Color (Standard_Real (myCLight.Color.r()),
Quantity_TOC_RGB); Standard_Real (myCLight.Color.g()),
Standard_Real (myCLight.Color.b()),
return (AColor); Quantity_TOC_RGB);
} }
/*----------------------------------------------------------------------*/ // =======================================================================
// function : LightType
Visual3d_TypeOfLightSource Visual3d_Light::LightType () const { // purpose :
// =======================================================================
return (MyType); Visual3d_TypeOfLightSource Visual3d_Light::LightType() const
{
return (Visual3d_TypeOfLightSource )myCLight.Type;
} }
/*----------------------------------------------------------------------*/ // =======================================================================
Standard_Boolean Visual3d_Light::Headlight () const { // function : Headlight
return MyCLight.Headlight==0? Standard_False:Standard_True; // purpose :
// =======================================================================
Standard_Boolean Visual3d_Light::Headlight() const
{
return myCLight.IsHeadlight;
} }
/*----------------------------------------------------------------------*/ // =======================================================================
// function : SetHeadlight
void Visual3d_Light::Values (Quantity_Color& Color) const { // purpose :
// =======================================================================
Quantity_Color AColor (Standard_Real (MyCLight.Color.r), void Visual3d_Light::SetHeadlight (const Standard_Boolean theValue)
Standard_Real (MyCLight.Color.g), {
Standard_Real (MyCLight.Color.b), myCLight.IsHeadlight = theValue;
Quantity_TOC_RGB);
if (MyType == Visual3d_TOLS_AMBIENT)
Color = AColor;
else Visual3d_LightDefinitionError::Raise
("Light Type != Visual3d_TOLS_AMBIENT");
} }
/*----------------------------------------------------------------------*/ // =======================================================================
// function : Values
void Visual3d_Light::Values (Quantity_Color& Color, Graphic3d_Vector& Direction) const { // purpose :
// =======================================================================
Quantity_Color AColor (Standard_Real (MyCLight.Color.r), void Visual3d_Light::Values (Quantity_Color& theColor) const
Standard_Real (MyCLight.Color.g), {
Standard_Real (MyCLight.Color.b), Visual3d_LightDefinitionError_Raise_if (myCLight.Type != Visual3d_TOLS_AMBIENT,
Quantity_TOC_RGB); "Light Type != Visual3d_TOLS_AMBIENT");
theColor.SetValues (Standard_Real (myCLight.Color.r()),
Graphic3d_Vector ADirection (Standard_Real (MyCLight.Direction.x), Standard_Real (myCLight.Color.g()),
Standard_Real (MyCLight.Direction.y), Standard_Real (myCLight.Color.b()),
Standard_Real (MyCLight.Direction.z)); Quantity_TOC_RGB);
if (MyType == Visual3d_TOLS_DIRECTIONAL) {
Color = AColor;
Direction = ADirection;
}
else Visual3d_LightDefinitionError::Raise
("Light Type != Visual3d_TOLS_DIRECTIONAL");
} }
/*----------------------------------------------------------------------*/ // =======================================================================
// function : Values
void Visual3d_Light::Values (Quantity_Color& Color, Graphic3d_Vertex& Position, Standard_Real& Fact1, Standard_Real& Fact2) const { // purpose :
// =======================================================================
Quantity_Color AColor (Standard_Real (MyCLight.Color.r), void Visual3d_Light::Values (Quantity_Color& theColor,
Standard_Real (MyCLight.Color.g), Graphic3d_Vector& theDir) const
Standard_Real (MyCLight.Color.b), {
Quantity_TOC_RGB); Visual3d_LightDefinitionError_Raise_if (myCLight.Type != Visual3d_TOLS_DIRECTIONAL,
"Light Type != Visual3d_TOLS_DIRECTIONAL");
Graphic3d_Vertex APosition (Standard_Real (MyCLight.Position.x), theColor.SetValues (Standard_Real (myCLight.Color.r()),
Standard_Real (MyCLight.Position.y), Standard_Real (myCLight.Color.g()),
Standard_Real (MyCLight.Position.z)); Standard_Real (myCLight.Color.b()),
Quantity_TOC_RGB);
if (MyType == Visual3d_TOLS_POSITIONAL) { theDir.SetCoord (Standard_Real (myCLight.Direction.x()),
Color = AColor; Standard_Real (myCLight.Direction.y()),
Position = APosition; Standard_Real (myCLight.Direction.z()));
Fact1 = Standard_Real (MyCLight.Attenuation[0]);
Fact2 = Standard_Real (MyCLight.Attenuation[1]);
}
else Visual3d_LightDefinitionError::Raise
("Light Type != Visual3d_TOLS_POSITIONAL");
} }
/*----------------------------------------------------------------------*/ // =======================================================================
// function : Values
void Visual3d_Light::Values (Quantity_Color& Color, Graphic3d_Vertex& Position, Graphic3d_Vector& Direction, Standard_Real& Concentration, Standard_Real& Fact1, Standard_Real& Fact2, Standard_Real& AngleCone) const { // purpose :
// =======================================================================
Quantity_Color AColor (Standard_Real (MyCLight.Color.r), void Visual3d_Light::Values (Quantity_Color& theColor,
Standard_Real (MyCLight.Color.g), Graphic3d_Vertex& thePos,
Standard_Real (MyCLight.Color.b), Standard_Real& theFact1,
Quantity_TOC_RGB); Standard_Real& theFact2) const
{
Graphic3d_Vertex APosition (Standard_Real (MyCLight.Position.x), Visual3d_LightDefinitionError_Raise_if (myCLight.Type != Visual3d_TOLS_POSITIONAL,
Standard_Real (MyCLight.Position.y), "Light Type != Visual3d_TOLS_POSITIONAL");
Standard_Real (MyCLight.Position.z)); theColor.SetValues (Standard_Real (myCLight.Color.r()),
Standard_Real (myCLight.Color.g()),
Graphic3d_Vector ADirection (Standard_Real (MyCLight.Direction.x), Standard_Real (myCLight.Color.b()),
Standard_Real (MyCLight.Direction.y), Quantity_TOC_RGB);
Standard_Real (MyCLight.Direction.z)); thePos.SetCoord (Standard_Real (myCLight.Position.x()),
Standard_Real (myCLight.Position.y()),
if (MyType == Visual3d_TOLS_SPOT) { Standard_Real (myCLight.Position.z()));
Color = AColor; theFact1 = Standard_Real (myCLight.ConstAttenuation());
Position = APosition; theFact2 = Standard_Real (myCLight.LinearAttenuation());
Direction = ADirection;
Concentration = Standard_Real (MyCLight.Concentration);
Fact1 = Standard_Real (MyCLight.Attenuation[0]);
Fact2 = Standard_Real (MyCLight.Attenuation[1]);
AngleCone = Standard_Real (MyCLight.Angle);
}
else Visual3d_LightDefinitionError::Raise
("Light Type != Visual3d_TOLS_SPOT");
} }
/*----------------------------------------------------------------------*/ // =======================================================================
// function : Values
void Visual3d_Light::SetAngle (const Standard_Real AngleCone) { // purpose :
// =======================================================================
if (! Visual3d_Light::IsValid (AngleCone)) void Visual3d_Light::Values (Quantity_Color& theColor,
Visual3d_LightDefinitionError::Raise Graphic3d_Vertex& thePos,
("Bad value for LightAngle"); Graphic3d_Vector& theDir,
Standard_Real& theConcentration,
if (MyType == Visual3d_TOLS_SPOT) { Standard_Real& theFact1,
MyCLight.Angle = float (AngleCone); Standard_Real& theFact2,
Standard_Real& theAngleCone) const
MyCLight.LightId = {
Graphic3d_GraphicDriver::Light (MyCLight, Standard_True); Visual3d_LightDefinitionError_Raise_if (myCLight.Type != Visual3d_TOLS_SPOT,
"Light Type != Visual3d_TOLS_SPOT");
} theColor.SetValues (Standard_Real (myCLight.Color.r()),
else Visual3d_LightDefinitionError::Raise Standard_Real (myCLight.Color.g()),
("Light Type != Visual3d_TOLS_SPOT"); Standard_Real (myCLight.Color.b()),
Quantity_TOC_RGB);
thePos.SetCoord (Standard_Real (myCLight.Position.x()),
Standard_Real (myCLight.Position.y()),
Standard_Real (myCLight.Position.z()));
theDir.SetCoord (Standard_Real (myCLight.Direction.x()),
Standard_Real (myCLight.Direction.y()),
Standard_Real (myCLight.Direction.z()));
theConcentration = Standard_Real (myCLight.Concentration());
theFact1 = Standard_Real (myCLight.ConstAttenuation());
theFact2 = Standard_Real (myCLight.LinearAttenuation());
theAngleCone = Standard_Real (myCLight.Angle());
} }
/*----------------------------------------------------------------------*/ // =======================================================================
// function : SetAngle
void Visual3d_Light::SetAttenuation1 (const Standard_Real Fact1) { // purpose :
// =======================================================================
if ( (Fact1 < 0.0) || (Fact1 > 1.0) ) void Visual3d_Light::SetAngle (const Standard_Real theAngleCone)
Visual3d_LightDefinitionError::Raise {
("Bad value for LightAttenuation"); Visual3d_LightDefinitionError_Raise_if (!Visual3d_Light::IsValid (theAngleCone),
"Bad value for LightAngle");
if ( (MyType == Visual3d_TOLS_POSITIONAL) || Visual3d_LightDefinitionError_Raise_if (myCLight.Type != Visual3d_TOLS_SPOT,
(MyType == Visual3d_TOLS_SPOT) ) { "Light Type != Visual3d_TOLS_SPOT");
MyCLight.Attenuation[0] = float (Fact1); myCLight.ChangeAngle() = Standard_ShortReal (theAngleCone);
MyCLight.LightId =
Graphic3d_GraphicDriver::Light (MyCLight, Standard_True);
}
else Visual3d_LightDefinitionError::Raise
("Light Type != Visual3d_TOLS_POSITIONAL and != Visual3d_TOLS_SPOT");
} }
/*----------------------------------------------------------------------*/ // =======================================================================
// function : SetAttenuation1
void Visual3d_Light::SetAttenuation2 (const Standard_Real Fact2) { // purpose :
// =======================================================================
if ( (Fact2 < 0.0) || (Fact2 > 1.0) ) void Visual3d_Light::SetAttenuation1 (const Standard_Real theFact1)
Visual3d_LightDefinitionError::Raise {
("Bad value for LightAttenuation"); Visual3d_LightDefinitionError_Raise_if (theFact1 < 0.0 || theFact1 > 1.0,
"Bad value for LightAttenuation");
if ( (MyType == Visual3d_TOLS_POSITIONAL) || Visual3d_LightDefinitionError_Raise_if (myCLight.Type != Visual3d_TOLS_POSITIONAL
(MyType == Visual3d_TOLS_SPOT) ) { && myCLight.Type != Visual3d_TOLS_SPOT,
MyCLight.Attenuation[1] = float (Fact2); "Light Type != Visual3d_TOLS_SPOT and != Visual3d_TOLS_POSITIONAL");
myCLight.ChangeConstAttenuation() = Standard_ShortReal (theFact1);
MyCLight.LightId =
Graphic3d_GraphicDriver::Light (MyCLight, Standard_True);
}
else Visual3d_LightDefinitionError::Raise
("Light Type != Visual3d_TOLS_POSITIONAL and != Visual3d_TOLS_SPOT");
} }
/*----------------------------------------------------------------------*/ // =======================================================================
// function : SetAttenuation2
void Visual3d_Light::SetColor (const Quantity_Color& Color) { // purpose :
// =======================================================================
MyCLight.Color.r = float (Color.Red ()); void Visual3d_Light::SetAttenuation2 (const Standard_Real theFact2)
MyCLight.Color.g = float (Color.Green ()); {
MyCLight.Color.b = float (Color.Blue ()); Visual3d_LightDefinitionError_Raise_if (theFact2 < 0.0 || theFact2 > 1.0,
"Bad value for LightAttenuation");
MyCLight.LightId = Visual3d_LightDefinitionError_Raise_if (myCLight.Type != Visual3d_TOLS_POSITIONAL
Graphic3d_GraphicDriver::Light (MyCLight, Standard_True); && myCLight.Type != Visual3d_TOLS_SPOT,
"Light Type != Visual3d_TOLS_SPOT and != Visual3d_TOLS_POSITIONAL");
myCLight.ChangeLinearAttenuation() = Standard_ShortReal (theFact2);
} }
/*----------------------------------------------------------------------*/ // =======================================================================
// function : SetColor
void Visual3d_Light::SetConcentration (const Standard_Real Concentration) { // purpose :
// =======================================================================
if ( (Concentration < 0.0) || (Concentration > 1.0) ) void Visual3d_Light::SetColor (const Quantity_Color& theColor)
Visual3d_LightDefinitionError::Raise {
("Bad value for LightConcentration"); myCLight.Color.r() = float (theColor.Red());
myCLight.Color.g() = float (theColor.Green());
if (MyType == Visual3d_TOLS_SPOT) { myCLight.Color.b() = float (theColor.Blue());
MyCLight.Concentration = float (Concentration);
MyCLight.LightId =
Graphic3d_GraphicDriver::Light (MyCLight, Standard_True);
}
else Visual3d_LightDefinitionError::Raise
("Light Type != Visual3d_TOLS_SPOT");
} }
/*----------------------------------------------------------------------*/ // =======================================================================
// function : SetConcentration
void Visual3d_Light::SetDirection (const Graphic3d_Vector& Direction) { // purpose :
// =======================================================================
if (Direction.LengthZero ()) void Visual3d_Light::SetConcentration (const Standard_Real theConcentration)
Visual3d_LightDefinitionError::Raise {
("Bad value for LightDirection"); Visual3d_LightDefinitionError_Raise_if (theConcentration < 0.0 || theConcentration > 1.0,
"Bad value for LightConcentration");
if ( (MyType == Visual3d_TOLS_DIRECTIONAL) || Visual3d_LightDefinitionError_Raise_if (myCLight.Type != Visual3d_TOLS_SPOT,
(MyType == Visual3d_TOLS_SPOT) ) { "Light Type != Visual3d_TOLS_SPOT");
myCLight.ChangeConcentration() = Standard_ShortReal (theConcentration);
Standard_Real Norme, X, Y, Z;
Direction.Coord (X, Y, Z);
Norme = Sqrt (X*X+Y*Y+Z*Z);
// Direction.LengthZero () == Standard_False
MyCLight.Direction.x = float (X/Norme);
MyCLight.Direction.y = float (Y/Norme);
MyCLight.Direction.z = float (Z/Norme);
MyCLight.LightId =
Graphic3d_GraphicDriver::Light (MyCLight, Standard_True);
}
else Visual3d_LightDefinitionError::Raise
("Light Type != Visual3d_TOLS_DIRECTIONAL and != Visual3d_TOLS_SPOT");
} }
/*----------------------------------------------------------------------*/ // =======================================================================
// function : SetDirection
void Visual3d_Light::SetPosition (const Graphic3d_Vertex& Position) { // purpose :
// =======================================================================
if ( (MyType == Visual3d_TOLS_POSITIONAL) || void Visual3d_Light::SetDirection (const Graphic3d_Vector& theDir)
(MyType == Visual3d_TOLS_SPOT) ) { {
Visual3d_LightDefinitionError_Raise_if (theDir.LengthZero(),
MyCLight.Position.x = float (Position.X ()); "Bad value for LightDirection");
MyCLight.Position.y = float (Position.Y ()); Visual3d_LightDefinitionError_Raise_if (myCLight.Type != Visual3d_TOLS_SPOT
MyCLight.Position.z = float (Position.Z ()); && myCLight.Type != Visual3d_TOLS_DIRECTIONAL,
"Light Type != Visual3d_TOLS_DIRECTIONAL and != Visual3d_TOLS_SPOT");
MyCLight.LightId = Standard_Real X, Y, Z;
Graphic3d_GraphicDriver::Light (MyCLight, Standard_True); theDir.Coord (X, Y, Z);
const Standard_Real aNorm = Sqrt (X * X + Y * Y + Z * Z);
} myCLight.Direction.x() = float (X / aNorm);
else Visual3d_LightDefinitionError::Raise myCLight.Direction.y() = float (Y / aNorm);
("Light Type != Visual3d_TOLS_POSITIONAL and != Visual3d_TOLS_SPOT"); myCLight.Direction.z() = float (Z / aNorm);
} }
/*----------------------------------------------------------------------*/ // =======================================================================
// function : SetPosition
Standard_Integer Visual3d_Light::Limit () { // purpose :
// =======================================================================
// Old method, replaced by GraphicDriver::InquireLightLimit () void Visual3d_Light::SetPosition (const Graphic3d_Vertex& thePos)
return 0; {
Visual3d_LightDefinitionError_Raise_if (myCLight.Type != Visual3d_TOLS_SPOT
&& myCLight.Type != Visual3d_TOLS_POSITIONAL,
"Light Type != Visual3d_TOLS_POSITIONAL and != Visual3d_TOLS_SPOT");
myCLight.Position.x() = float (thePos.X());
myCLight.Position.y() = float (thePos.Y());
myCLight.Position.z() = float (thePos.Z());
} }
/*----------------------------------------------------------------------*/ // =======================================================================
// function : Limit
Standard_Integer Visual3d_Light::Identification () const { // purpose :
// =======================================================================
return (Standard_Integer (MyCLight.LightId)); Standard_Integer Visual3d_Light::Limit()
{
// Old method, replaced by GraphicDriver::InquireLightLimit()
return 0;
} }
/*----------------------------------------------------------------------*/ // =======================================================================
// function : Identification
Standard_Boolean Visual3d_Light::IsValid (const Standard_Real AAngle) { // purpose :
// =======================================================================
return ( (AAngle < M_PI) && (AAngle >= 0.0) ); Standard_Integer Visual3d_Light::Identification() const
{
return 0;
} }
/*----------------------------------------------------------------------*/ // =======================================================================
// function : IsValid
// purpose :
// =======================================================================
Standard_Boolean Visual3d_Light::IsValid (const Standard_Real theAngle)
{
return (theAngle < M_PI)
&& (theAngle >= 0.0);
}
// =======================================================================
// function : CLight
// purpose :
// =======================================================================
const Graphic3d_CLight& Visual3d_Light::CLight() const
{
return myCLight;
}

View File

@ -79,9 +79,6 @@
#define BUC60572 //GG_03-08-99 Add protection on Zclipping & Zcueing planes #define BUC60572 //GG_03-08-99 Add protection on Zclipping & Zcueing planes
// positions. // positions.
#define BUC60570 //GG 14-09-99 Don't activates lighting
// when the view shading model is NONE.
#define GER61454 //GG 14-09-99 Activates model clipping planes #define GER61454 //GG 14-09-99 Activates model clipping planes
#define RIC120302 //GG Add a NEW SetWindow method which enable #define RIC120302 //GG Add a NEW SetWindow method which enable
@ -706,148 +703,45 @@ Standard_Real Rap;
} }
void Visual3d_View::UpdateLights () { void Visual3d_View::UpdateLights()
{
Standard_Integer i, j; if (IsDeleted()
CALL_DEF_LIGHT *lights=NULL; || !IsDefined())
{
#ifdef BUC60570 return;
if( MyContext.Model() == Visual3d_TOM_NONE ) {
// Activates only a white ambient light
MyCView.Context.NbActiveLight = 1;
lights = new CALL_DEF_LIGHT [MyCView.Context.NbActiveLight];
MyCView.Context.ActiveLight = lights;
lights[0].WsId = MyCView.ViewId;
lights[0].ViewId = MyCView.ViewId;
lights[0].LightType = int (Visual3d_TOLS_AMBIENT);
lights[0].Active = 1;
lights[0].LightId = 0;
lights[0].Headlight = 0;
lights[0].Color.r = lights[0].Color.g = lights[0].Color.b = 1.;
} else {
#endif
i = MyContext.NumberOfActivatedLights ();
j = MyGraphicDriver->InquireLightLimit ();
MyCView.Context.NbActiveLight = (i > j ? j : i);
if (MyCView.Context.NbActiveLight > 0) {
// Dynamic Allocation
lights = new CALL_DEF_LIGHT [MyCView.Context.NbActiveLight];
MyCView.Context.ActiveLight = lights;
Standard_Real X, Y, Z;
Standard_Real LightConcentration = 0.;
Standard_Real LightAttenuation1 = 0.;
Standard_Real LightAttenuation2 = 0.;
Standard_Real LightAngle = 0.;
Quantity_Color LightColor;
Graphic3d_Vertex LightPosition;
Graphic3d_Vector LightDirection;
Visual3d_TypeOfLightSource LightType=Visual3d_TOLS_AMBIENT;
// Parcing of light sources
for (j=0; j<MyCView.Context.NbActiveLight; j++) {
LightType = (MyContext.ActivatedLight (j+1))->LightType ();
lights[j].WsId = MyCView.ViewId;
lights[j].ViewId = MyCView.ViewId;
lights[j].LightType = int (LightType);
lights[j].Active = 1;
lights[j].LightId =
int ((MyContext.ActivatedLight (j+1))->Identification ());
lights[j].Headlight = (MyContext.ActivatedLight (j+1))->Headlight ()? 1:0;
switch (LightType) {
case Visual3d_TOLS_AMBIENT :
(MyContext.ActivatedLight (j+1))->Values (
LightColor
);
break;
case Visual3d_TOLS_POSITIONAL :
(MyContext.ActivatedLight (j+1))->Values (
LightColor,
LightPosition,
LightAttenuation1,
LightAttenuation2
);
break;
case Visual3d_TOLS_DIRECTIONAL :
(MyContext.ActivatedLight (j+1))->Values (
LightColor,
LightDirection
);
break;
case Visual3d_TOLS_SPOT :
(MyContext.ActivatedLight (j+1))->Values (
LightColor,
LightPosition,
LightDirection,
LightConcentration,
LightAttenuation1,
LightAttenuation2,
LightAngle
);
break;
}
lights[j].Color.r = float (LightColor.Red ());
lights[j].Color.g = float (LightColor.Green ());
lights[j].Color.b = float (LightColor.Blue ());
if ( (LightType == Visual3d_TOLS_POSITIONAL) ||
(LightType == Visual3d_TOLS_SPOT) ) {
LightPosition.Coord (X, Y, Z);
lights[j].Position.x = float (X);
lights[j].Position.y = float (Y);
lights[j].Position.z = float (Z);
}
if ( (LightType == Visual3d_TOLS_DIRECTIONAL) ||
(LightType == Visual3d_TOLS_SPOT) ) {
LightDirection.Coord (X, Y, Z);
lights[j].Direction.x = float (X);
lights[j].Direction.y = float (Y);
lights[j].Direction.z = float (Z);
}
if ( (LightType == Visual3d_TOLS_POSITIONAL) ||
(LightType == Visual3d_TOLS_SPOT) ) {
lights[j].Attenuation[0] =
float (LightAttenuation1);
lights[j].Attenuation[1] =
float (LightAttenuation2);
}
if (LightType == Visual3d_TOLS_SPOT) {
lights[j].Concentration =
float (LightConcentration);
lights[j].Angle =
float (LightAngle);
}
}
}
#ifdef BUC60570
} }
#endif
// management of light sources
if (! IsDeleted ())
if (IsDefined ())
MyGraphicDriver->SetLight (MyCView);
// Dynamic allocation if (MyContext.Model() == Visual3d_TOM_NONE)
if (MyCView.Context.NbActiveLight > 0) delete [] lights; {
// activate only a white ambient light
Graphic3d_CLight aCLight;
aCLight.Type = Visual3d_TOLS_AMBIENT;
aCLight.IsHeadlight = Standard_False;
aCLight.Color.r() = aCLight.Color.g() = aCLight.Color.b() = 1.0f;
MyCView.Context.NbActiveLight = 1;
MyCView.Context.ActiveLight = &aCLight;
MyGraphicDriver->SetLight (MyCView);
MyCView.Context.ActiveLight = NULL;
return;
}
MyCView.Context.NbActiveLight = Min (MyContext.NumberOfActivatedLights(),
MyGraphicDriver->InquireLightLimit());
if (MyCView.Context.NbActiveLight < 1)
{
return;
}
// parcing of light sources
MyCView.Context.ActiveLight = new Graphic3d_CLight[MyCView.Context.NbActiveLight];
for (Standard_Integer aLightIter = 0; aLightIter < MyCView.Context.NbActiveLight; ++aLightIter)
{
MyCView.Context.ActiveLight[aLightIter] = MyContext.ActivatedLight (aLightIter + 1)->CLight();
}
MyGraphicDriver->SetLight (MyCView);
delete[] MyCView.Context.ActiveLight;
MyCView.Context.ActiveLight = NULL;
} }
void Visual3d_View::UpdatePlanes() void Visual3d_View::UpdatePlanes()

View File

@ -9,6 +9,7 @@ box b 1 2 3
vinit View1 vinit View1
vclear vclear
vsetdispmode 1 vsetdispmode 1
vaxo
vdisplay b vdisplay b
vfit vfit
vrotate 0.2 0.0 0.0 vrotate 0.2 0.0 0.0

View File

@ -12,6 +12,7 @@ vinit View1
vclear vclear
vdefaults absDefl=0.5 vdefaults absDefl=0.5
vsetdispmode 1 vsetdispmode 1
vaxo
vdisplay f vdisplay f
vfit vfit
vrotate -0.5 0.0 0.0 vrotate -0.5 0.0 0.0

View File

@ -11,6 +11,7 @@ vinit View1
vclear vclear
vdefaults absDefl=0.5 vdefaults absDefl=0.5
vsetdispmode 1 vsetdispmode 1
vaxo
vdisplay f vdisplay f
vfit vfit
vrotate -0.5 0.0 0.0 vrotate -0.5 0.0 0.0

View File

@ -0,0 +1,39 @@
puts "========"
puts "Per-pixel lighting using GLSL program (Phong shading)"
puts "========"
# import model
restore [locate_data_file occ/fuse.brep] f
tclean f
# draw box
vinit View1
vclear
vdefaults absDefl=0.5
vsetdispmode 1
vaxo
vdisplay f
vfit
vrotate -0.5 0.0 0.0
vfit
# setup lights
vlight delete 0
vlight delete 0
vlight delete 0
vlight delete 0
vlight delete 0
vlight add ambient color WHITE
vlight add directional dir 1 0 0 color GREEN headlight 1
vlight add directional dir -1 0 0 color RED1 headlight 1
# take snapshot with fixed pipeline
vdump $::imagedir/${::casename}_OFF.png
vshaderprog f phong
vdump $::imagedir/${::casename}_ph1.png
vclear
vdisplay f
vshaderprog f phong
vdump $::imagedir/${::casename}_ph2.png
vmoveto 250 250

View File

@ -9,6 +9,7 @@ box b 1 2 3
vinit View1 vinit View1
vclear vclear
vsetdispmode 1 vsetdispmode 1
vaxo
vdisplay b vdisplay b
vfit vfit
vrotate 0.2 0.0 0.0 vrotate 0.2 0.0 0.0