Beispiel #1
0
GLC_Light::GLC_Light(LightType lightType, GLC_Context *pContext, const QColor& color)
    : GLC_Object("Light")
    , m_LightID(-1)
    , m_LightType(lightType)
    , m_AmbientColor(Qt::black)
    , m_DiffuseColor(color)
    , m_SpecularColor(Qt::white)
    , m_Position()
    , m_SpotDirection(0.0, 0.0, -1.0)
    , m_SpotExponent(0.0f)
    , m_SpotCutoffAngle(180.0f)
    , m_ConstantAttenuation(1.0f)
    , m_LinearAttenuation(0.0f)
    , m_QuadraticAttenuation(0.0f)
    , m_TwoSided(false)
    , m_pContext(pContext)
    , m_Shared(false)
{
    addNewLight();
}
Beispiel #2
0
GLC_Light::GLC_Light(const GLC_Light& light)
    : GLC_Object(light)
    , m_LightID(-1)
    , m_LightType(light.m_LightType)
    , m_AmbientColor(light.m_AmbientColor)
    , m_DiffuseColor(light.m_DiffuseColor)
    , m_SpecularColor(light.m_SpecularColor)
    , m_Position(light.m_Position)
    , m_SpotDirection(light.m_SpotDirection)
    , m_SpotExponent(light.m_SpotExponent)
    , m_SpotCutoffAngle(light.m_SpotCutoffAngle)
    , m_ConstantAttenuation(light.m_ConstantAttenuation)
    , m_LinearAttenuation(light.m_LinearAttenuation)
    , m_QuadraticAttenuation(light.m_QuadraticAttenuation)
    , m_TwoSided(light.m_TwoSided)
    , m_pContext(light.m_pContext)
    , m_Shared(light.m_Shared)
{
    addNewLight();
}
Beispiel #3
0
void GLC_Light::glExecute()
{

    GLC_Context* pCurrentContext= GLC_ContextManager::instance()->currentContext();
    Q_ASSERT(NULL != pCurrentContext);
    if (NULL == m_pContext)
    {
        m_pContext= pCurrentContext;
        addNewLight();
    }

    pCurrentContext->glcEnableLighting(true);
    pCurrentContext->glcEnableLight(m_LightID);

    if (m_pContext != pCurrentContext)
    {
        Q_ASSERT(QOpenGLContext::areSharing(m_pContext->contextHandle(), pCurrentContext->contextHandle()));
    }
    Q_ASSERT(m_pContext->contextHandle()->isValid());

    GLfloat setArray[4];

    // Position
    setArray[0]= static_cast<GLfloat>(m_Position.x());
    setArray[1]= static_cast<GLfloat>(m_Position.y());
    setArray[2]= static_cast<GLfloat>(m_Position.z());

    if (LightDirection == m_LightType)
    {
        setArray[3]= 0.0f;
        glLightfv(m_LightID, GL_POSITION, setArray);	// Direction of the Light
    }
    else
    {
        setArray[3]= 1.0f;
        glLightfv(m_LightID, GL_POSITION, setArray);	// Position of the Light
    }


    // Set the lighting model
    pCurrentContext->glcSetTwoSidedLight(m_TwoSided);

    // Color
    setArray[0]= static_cast<GLfloat>(m_AmbientColor.redF());
    setArray[1]= static_cast<GLfloat>(m_AmbientColor.greenF());
    setArray[2]= static_cast<GLfloat>(m_AmbientColor.blueF());
    setArray[3]= static_cast<GLfloat>(m_AmbientColor.alphaF());
    glLightfv(m_LightID, GL_AMBIENT, setArray);		// Setup The Ambient Light

    setArray[0]= static_cast<GLfloat>(m_DiffuseColor.redF());
    setArray[1]= static_cast<GLfloat>(m_DiffuseColor.greenF());
    setArray[2]= static_cast<GLfloat>(m_DiffuseColor.blueF());
    setArray[3]= static_cast<GLfloat>(m_DiffuseColor.alphaF());
    glLightfv(m_LightID, GL_DIFFUSE, setArray);		// Setup The Diffuse Light


    setArray[0]= static_cast<GLfloat>(m_SpecularColor.redF());
    setArray[1]= static_cast<GLfloat>(m_SpecularColor.greenF());
    setArray[2]= static_cast<GLfloat>(m_SpecularColor.blueF());
    setArray[3]= static_cast<GLfloat>(m_SpecularColor.alphaF());
    glLightfv(m_LightID, GL_SPECULAR, setArray);	// Setup The specular Light

    if (LightDirection != m_LightType)
        glLightf(m_LightID, GL_CONSTANT_ATTENUATION, m_ConstantAttenuation);
    glLightf(m_LightID, GL_LINEAR_ATTENUATION, m_LinearAttenuation);
    glLightf(m_LightID, GL_QUADRATIC_ATTENUATION, m_QuadraticAttenuation);

    // Spot light parameters
    if (LightSpot == m_LightType)
    {
        // Spot Direction
        setArray[0]= static_cast<GLfloat>(m_SpotDirection.x());
        setArray[1]= static_cast<GLfloat>(m_SpotDirection.y());
        setArray[2]= static_cast<GLfloat>(m_SpotDirection.z());
        glLightfv(m_LightID, GL_SPOT_DIRECTION, setArray);
        glLightf(m_LightID, GL_SPOT_EXPONENT, m_SpotExponent);
        glLightf(m_LightID, GL_SPOT_CUTOFF, m_SpotCutoffAngle);
    }


    // OpenGL error handler
    GLenum error= glGetError();
    if (error != GL_NO_ERROR)
    {
        qDebug() << "GLC_Light::glExecute Exception, id= " << m_LightID;
        GLC_OpenGlException OpenGlException("GLC_Light::glExecute ", error);
        throw(OpenGlException);
    }

}
void LightEditor::menuCallback(cvr::MenuItem * item)
{
    // Used later if necessary 
    //bool isDir, isPoi, isSpo, isAmb, isDif, isSpe, isCon, isLin, isQua, isExp, isCut;

    if (item == _createNewLightButton)
    {
        addNewLight();

        osg::Vec4 pos = osg::Vec4(0,500.0,0,1);

        if (cvr::ComController::instance()->isMaster())
            pos = pos * cvr::PluginHelper::getMouseMat();
        else
            pos = pos * cvr::PluginHelper::getHandMat();

        mLightManager->PhysicalPosition(pos * cvr::PluginHelper::getWorldToObjectTransform());

        // Let's also default to point lights
        mLightManager->LightType(LightManager::POINT);

    }

    else if (item == _selectLightList)
    {
        if (mLightManager->selectLightByName(_selectLightList->getValue()))
                updateEditLightMenu();
    }

    else if (item == _graphicModelsCheckbox)
    {        
        if (_graphicModelsCheckbox->getValue())
            mLightManager->enableGraphicModels();
        else
            mLightManager->disableGraphicModels();
    }

    else if (item == _saveLightsButton)
    {
        static std::string lightXmlFile = cvr::ConfigManager::getEntry("value","Plugin.LightEditor.LightXmlFile","");

        if (lightXmlFile.empty())
            std::cerr << "Attention: No XML filepath given in config file. Cannot save lights until a filepath exists." << std::endl;
        else
            LightLoader::saveLights(lightXmlFile.c_str(), mLightManager);
    }

    // Color  for Ambient, Diffuse, and Specular
    else if (item == _elR || item == _elG || item == _elB)
    {
        osg::Vec4 (LightManager::*getFunc)();
        void (LightManager::*setFunc)(const osg::Vec4);

        std::string colorType = _elColorTypeList->getValue();
        if (colorType == "Ambient")
        {
            getFunc = &LightManager::Ambient;
            setFunc = &LightManager::Ambient;
        }
        else if (colorType == "Diffuse")
        {
            getFunc = &LightManager::Diffuse;
            setFunc = &LightManager::Diffuse;
        }
        else // Specular
        {
            getFunc = &LightManager::Specular;
            setFunc = &LightManager::Specular;
        }
    
        if (item == _elR)
        {
             osg::Vec4 val = (mLightManager->*getFunc)();
             val.set(_elR->getValue(), val.y(), val.z(), val.w());
             (mLightManager->*setFunc)(val);
        }
        if (item == _elG)
        {
             osg::Vec4 val = (mLightManager->*getFunc)();
             val.set(val.x(), _elG->getValue(), val.z(), val.w());
             (mLightManager->*setFunc)(val);
        }
        if (item == _elB)
        {
             osg::Vec4 val = (mLightManager->*getFunc)();
             val.set(val.x(), val.y(), _elB->getValue(), val.w());
             (mLightManager->*setFunc)(val);
        }
    }

    // Factor  for attenuation
    else if (item == _elAttenuation)
    {
        void (LightManager::*setFunc)(const float);

        std::string attenuation = _elAttenuationList->getValue();
        if (attenuation == "Constant")
        {
            setFunc = &LightManager::ConstantAttenuation;
        }
        else if (attenuation == "Linear")
        {
            setFunc = &LightManager::LinearAttenuation;
        }
        else // Quadratic
        {
            setFunc = &LightManager::QuadraticAttenuation;
        }

        (mLightManager->*setFunc)(_elAttenuation->getValue());        
    }    


    //  for spot settings
    else if (item == _elSpotExponent)
    {
        mLightManager->SpotExponent(_elSpotExponent->getValue());
    }

    else if (item == _elSpotCutoff)
    {
        mLightManager->SpotCutoff(_elSpotCutoff->getValue());
    }

    // Treat Directional, Point, and Spot buttons as Radio Buttons
    else if (item == _elLightTypeList)
    {
        std::string lightType = _elLightTypeList->getValue();
        LightManager::Type type;
        if (lightType == "Directional")
            type = LightManager::DIRECTIONAL;
        else if (lightType == "Spot")
            type = LightManager::SPOT;
        else // "Point"
            type = LightManager::POINT;

        mLightManager->LightType(type);
    } 

    if (_elToggleEnable == item)
    {
        if (_elToggleEnable->getValue())
            mLightManager->enableLight();
        else
            mLightManager->disableLight();
    }

    // Make sure to update the menu
    updateEditLightMenu();
}