|
|
|
/*
|
|
|
|
**************************************************************************
|
|
|
|
description
|
|
|
|
--------------------
|
|
|
|
copyright : (C) 2003 by Leon Pennington
|
|
|
|
email : leon@leonscape.co.uk
|
|
|
|
**************************************************************************
|
|
|
|
|
|
|
|
**************************************************************************
|
|
|
|
* *
|
|
|
|
* This program is free software; you can redistribute it and/or modify *
|
|
|
|
* it under the terms of the GNU General Public License as published by *
|
|
|
|
* the Free Software Foundation; either version 2 of the License, or *
|
|
|
|
* (at your option) any later version. *
|
|
|
|
* *
|
|
|
|
**************************************************************************/
|
|
|
|
|
|
|
|
|
|
|
|
#include "pmradiosity.h"
|
|
|
|
#include "pmxmlhelper.h"
|
|
|
|
#include "pmmemento.h"
|
|
|
|
#include "pmradiosityedit.h"
|
|
|
|
|
|
|
|
#include <klocale.h>
|
|
|
|
|
|
|
|
const double adcBailoutDefault = 0.01;
|
|
|
|
const double brightnessDefault = 1.0;
|
|
|
|
const int countDefault = 35;
|
|
|
|
const double errorBoundDefault = 1.8;
|
|
|
|
const double grayThresholdDefault = 0.0;
|
|
|
|
const double lowErrorFactorDefault = 0.5;
|
|
|
|
const double maxSampleDefault = -1.0;
|
|
|
|
const double minimumReuseDefault = 0.015;
|
|
|
|
const int nearestCountDefault = 5;
|
|
|
|
const double pretraceStartDefault = 0.08;
|
|
|
|
const double pretraceEndDefault = 0.04;
|
|
|
|
const int recursionLimitDefault = 2;
|
|
|
|
|
|
|
|
PMDefinePropertyClass( PMRadiosity, PMRadiosityProperty );
|
|
|
|
PMMetaObject* PMRadiosity::s_pMetaObject = 0;
|
|
|
|
PMObject* createNewRadiosity( PMPart* part )
|
|
|
|
{
|
|
|
|
return new PMRadiosity( part );
|
|
|
|
}
|
|
|
|
|
|
|
|
PMRadiosity::PMRadiosity( PMPart* part ) : Base( part )
|
|
|
|
{
|
|
|
|
m_adcBailout = adcBailoutDefault;
|
|
|
|
m_alwaysSample = true;
|
|
|
|
m_brightness = brightnessDefault;
|
|
|
|
m_count = countDefault;
|
|
|
|
m_errorBound = errorBoundDefault;
|
|
|
|
m_grayThreshold = grayThresholdDefault;
|
|
|
|
m_lowErrorFactor = lowErrorFactorDefault;
|
|
|
|
m_maxSample = maxSampleDefault;
|
|
|
|
m_media = false;
|
|
|
|
m_minimumReuse = minimumReuseDefault;
|
|
|
|
m_nearestCount = nearestCountDefault;
|
|
|
|
m_normal = false;
|
|
|
|
m_pretraceStart = pretraceStartDefault;
|
|
|
|
m_pretraceEnd = pretraceEndDefault;
|
|
|
|
m_recursionLimit = recursionLimitDefault;
|
|
|
|
}
|
|
|
|
|
|
|
|
PMRadiosity::PMRadiosity( const PMRadiosity& r )
|
|
|
|
: Base( r )
|
|
|
|
{
|
|
|
|
m_adcBailout = r.m_adcBailout;
|
|
|
|
m_alwaysSample = r.m_alwaysSample;
|
|
|
|
m_brightness = r.m_brightness;
|
|
|
|
m_count = r.m_count;
|
|
|
|
m_errorBound = r.m_errorBound;
|
|
|
|
m_grayThreshold = r.m_grayThreshold;
|
|
|
|
m_lowErrorFactor = r.m_lowErrorFactor;
|
|
|
|
m_maxSample = r.m_maxSample;
|
|
|
|
m_media = r.m_media;
|
|
|
|
m_minimumReuse = r.m_minimumReuse;
|
|
|
|
m_nearestCount = r.m_nearestCount;
|
|
|
|
m_normal = r.m_normal;
|
|
|
|
m_pretraceStart = r.m_pretraceStart;
|
|
|
|
m_pretraceEnd = r.m_pretraceEnd;
|
|
|
|
m_recursionLimit = r.m_recursionLimit;
|
|
|
|
}
|
|
|
|
|
|
|
|
PMRadiosity::~PMRadiosity( )
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
|
|
|
PMMetaObject* PMRadiosity::tqmetaObject( ) const
|
|
|
|
{
|
|
|
|
if( !s_pMetaObject )
|
|
|
|
{
|
|
|
|
s_pMetaObject = new PMMetaObject( "Radiosity", Base::tqmetaObject( ),
|
|
|
|
createNewRadiosity );
|
|
|
|
s_pMetaObject->addProperty(
|
|
|
|
new PMRadiosityProperty( "adcBailout", &PMRadiosity::setAdcBailout, &PMRadiosity::adcBailout ) );
|
|
|
|
s_pMetaObject->addProperty(
|
|
|
|
new PMRadiosityProperty( "alwaysSample", &PMRadiosity::setAlwaysSample, &PMRadiosity::alwaysSample ) );
|
|
|
|
s_pMetaObject->addProperty(
|
|
|
|
new PMRadiosityProperty( "brightness", &PMRadiosity::setBrightness, &PMRadiosity::brightness ) );
|
|
|
|
s_pMetaObject->addProperty(
|
|
|
|
new PMRadiosityProperty( "count", &PMRadiosity::setCount, &PMRadiosity::count ) );
|
|
|
|
s_pMetaObject->addProperty(
|
|
|
|
new PMRadiosityProperty( "errorBound", &PMRadiosity::setErrorBound, &PMRadiosity::errorBound ) );
|
|
|
|
s_pMetaObject->addProperty(
|
|
|
|
new PMRadiosityProperty( "grayThreshold", &PMRadiosity::setGrayThreshold, &PMRadiosity::grayThreshold ) );
|
|
|
|
s_pMetaObject->addProperty(
|
|
|
|
new PMRadiosityProperty( "lowErrorFactor", &PMRadiosity::setLowErrorFactor, &PMRadiosity::lowErrorFactor ) );
|
|
|
|
s_pMetaObject->addProperty(
|
|
|
|
new PMRadiosityProperty( "maxSample", &PMRadiosity::setMaxSample, &PMRadiosity::maxSample ) );
|
|
|
|
s_pMetaObject->addProperty(
|
|
|
|
new PMRadiosityProperty( "media", &PMRadiosity::setMedia, &PMRadiosity::media ) );
|
|
|
|
s_pMetaObject->addProperty(
|
|
|
|
new PMRadiosityProperty( "minimumReuse", &PMRadiosity::setMinimumReuse, &PMRadiosity::minimumReuse ) );
|
|
|
|
s_pMetaObject->addProperty(
|
|
|
|
new PMRadiosityProperty( "nearestCount", &PMRadiosity::setNearestCount, &PMRadiosity::nearestCount ) );
|
|
|
|
s_pMetaObject->addProperty(
|
|
|
|
new PMRadiosityProperty( "normal", &PMRadiosity::setNormal, &PMRadiosity::normal ) );
|
|
|
|
s_pMetaObject->addProperty(
|
|
|
|
new PMRadiosityProperty( "pretraceStart", &PMRadiosity::setPretraceStart, &PMRadiosity::pretraceStart ) );
|
|
|
|
s_pMetaObject->addProperty(
|
|
|
|
new PMRadiosityProperty( "pretraceEnd", &PMRadiosity::setPretraceEnd, &PMRadiosity::pretraceEnd ) );
|
|
|
|
s_pMetaObject->addProperty(
|
|
|
|
new PMRadiosityProperty( "recursionLimit", &PMRadiosity::setRecursionLimit, &PMRadiosity::recursionLimit ) );
|
|
|
|
}
|
|
|
|
return s_pMetaObject;
|
|
|
|
}
|
|
|
|
|
|
|
|
void PMRadiosity::cleanUp( ) const
|
|
|
|
{
|
|
|
|
if( s_pMetaObject )
|
|
|
|
{
|
|
|
|
delete s_pMetaObject;
|
|
|
|
s_pMetaObject = 0;
|
|
|
|
}
|
|
|
|
Base::cleanUp( );
|
|
|
|
}
|
|
|
|
|
|
|
|
TQString PMRadiosity::description( ) const
|
|
|
|
{
|
|
|
|
return i18n( "radiosity" );
|
|
|
|
}
|
|
|
|
|
|
|
|
void PMRadiosity::serialize( TQDomElement& e, TQDomDocument& ) const
|
|
|
|
{
|
|
|
|
e.setAttribute( "adc_bailout", m_adcBailout );
|
|
|
|
|
|
|
|
if ( m_alwaysSample )
|
|
|
|
e.setAttribute( "always_sample", "1" );
|
|
|
|
else
|
|
|
|
e.setAttribute( "always_sample", "0" );
|
|
|
|
|
|
|
|
e.setAttribute( "brightness", m_brightness );
|
|
|
|
e.setAttribute( "count", m_count );
|
|
|
|
e.setAttribute( "error_bound", m_errorBound );
|
|
|
|
e.setAttribute( "gray_threshold", m_grayThreshold );
|
|
|
|
e.setAttribute( "low_error_factor", m_lowErrorFactor );
|
|
|
|
e.setAttribute( "max_sample", m_maxSample );
|
|
|
|
|
|
|
|
if ( m_media )
|
|
|
|
e.setAttribute( "media", "1" );
|
|
|
|
else
|
|
|
|
e.setAttribute( "media", "0" );
|
|
|
|
|
|
|
|
e.setAttribute( "minimum_reuse", m_minimumReuse );
|
|
|
|
e.setAttribute( "nearest_count", m_nearestCount );
|
|
|
|
|
|
|
|
if ( m_normal )
|
|
|
|
e.setAttribute( "normal", "1" );
|
|
|
|
else
|
|
|
|
e.setAttribute( "normal", "0" );
|
|
|
|
|
|
|
|
e.setAttribute( "pretrace_start", m_pretraceStart );
|
|
|
|
e.setAttribute( "pretrace_end", m_pretraceEnd );
|
|
|
|
e.setAttribute( "recursion_limit", m_recursionLimit );
|
|
|
|
}
|
|
|
|
|
|
|
|
void PMRadiosity::readAttributes( const PMXMLHelper& h )
|
|
|
|
{
|
|
|
|
m_adcBailout = h.doubleAttribute( "adc_bailout", adcBailoutDefault );
|
|
|
|
m_alwaysSample = h.boolAttribute( "always_sample", true );
|
|
|
|
m_brightness = h.doubleAttribute( "brightness", brightnessDefault );
|
|
|
|
m_count = h.intAttribute( "count", countDefault );
|
|
|
|
m_errorBound = h.doubleAttribute( "error_bound", errorBoundDefault );
|
|
|
|
m_grayThreshold = h.doubleAttribute( "gray_threshold", grayThresholdDefault );
|
|
|
|
m_lowErrorFactor = h.doubleAttribute( "low_error_factor", lowErrorFactorDefault );
|
|
|
|
m_maxSample = h.doubleAttribute( "max_sample", maxSampleDefault );
|
|
|
|
m_media = h.boolAttribute( "media", false );
|
|
|
|
m_minimumReuse = h.doubleAttribute( "minimum_reuse", minimumReuseDefault );
|
|
|
|
m_nearestCount = h.intAttribute( "nearest_count", nearestCountDefault );
|
|
|
|
m_normal = h.boolAttribute( "normal", false );
|
|
|
|
m_pretraceStart = h.doubleAttribute( "pretrace_start", pretraceStartDefault );
|
|
|
|
m_pretraceEnd = h.doubleAttribute( "pretrace_end", pretraceEndDefault );
|
|
|
|
m_recursionLimit = h.intAttribute( "recursion_limit", recursionLimitDefault );
|
|
|
|
}
|
|
|
|
|
|
|
|
void PMRadiosity::setAdcBailout( double ab )
|
|
|
|
{
|
|
|
|
if( ab != m_adcBailout )
|
|
|
|
{
|
|
|
|
if( m_pMemento )
|
|
|
|
m_pMemento->addData( s_pMetaObject, PMAdcBailoutID, m_adcBailout );
|
|
|
|
m_adcBailout = ab;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void PMRadiosity::setAlwaysSample( bool as )
|
|
|
|
{
|
|
|
|
if( as != m_alwaysSample )
|
|
|
|
{
|
|
|
|
if( m_pMemento )
|
|
|
|
m_pMemento->addData( s_pMetaObject, PMAlwaysSampleID, m_alwaysSample );
|
|
|
|
m_alwaysSample = as;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void PMRadiosity::setBrightness( double b )
|
|
|
|
{
|
|
|
|
if( b != m_brightness )
|
|
|
|
{
|
|
|
|
if( m_pMemento )
|
|
|
|
m_pMemento->addData( s_pMetaObject, PMBrightnessID, m_brightness );
|
|
|
|
m_brightness = b;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void PMRadiosity::setCount( int c )
|
|
|
|
{
|
|
|
|
if( c != m_count )
|
|
|
|
{
|
|
|
|
if( m_pMemento )
|
|
|
|
m_pMemento->addData( s_pMetaObject, PMCountID, m_count );
|
|
|
|
m_count = c;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void PMRadiosity::setErrorBound( double eb )
|
|
|
|
{
|
|
|
|
if( eb != m_errorBound )
|
|
|
|
{
|
|
|
|
if( m_pMemento )
|
|
|
|
m_pMemento->addData( s_pMetaObject, PMErrorBoundID, m_errorBound );
|
|
|
|
m_errorBound = eb;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void PMRadiosity::setGrayThreshold( double gt )
|
|
|
|
{
|
|
|
|
if( gt != m_grayThreshold )
|
|
|
|
{
|
|
|
|
if( m_pMemento )
|
|
|
|
m_pMemento->addData( s_pMetaObject, PMGrayThresholdID, m_grayThreshold );
|
|
|
|
m_grayThreshold = gt;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void PMRadiosity::setLowErrorFactor( double lew )
|
|
|
|
{
|
|
|
|
if( lew != m_lowErrorFactor )
|
|
|
|
{
|
|
|
|
if( m_pMemento )
|
|
|
|
m_pMemento->addData( s_pMetaObject, PMLowErrorFactorID, m_lowErrorFactor );
|
|
|
|
m_lowErrorFactor = lew;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void PMRadiosity::setMaxSample( double ms )
|
|
|
|
{
|
|
|
|
if( ms != m_maxSample )
|
|
|
|
{
|
|
|
|
if( m_pMemento )
|
|
|
|
m_pMemento->addData( s_pMetaObject, PMMaxSampleID, m_maxSample );
|
|
|
|
m_maxSample = ms;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void PMRadiosity::setMedia( bool m )
|
|
|
|
{
|
|
|
|
if( m != m_media )
|
|
|
|
{
|
|
|
|
if( m_pMemento )
|
|
|
|
m_pMemento->addData( s_pMetaObject, PMMediaID, m_media );
|
|
|
|
m_media = m;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void PMRadiosity::setMinimumReuse( double c )
|
|
|
|
{
|
|
|
|
if( c != m_minimumReuse )
|
|
|
|
{
|
|
|
|
if( m_pMemento )
|
|
|
|
m_pMemento->addData( s_pMetaObject, PMMinimumReuseID, m_minimumReuse );
|
|
|
|
m_minimumReuse = c;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void PMRadiosity::setNearestCount( int c )
|
|
|
|
{
|
|
|
|
if( c != m_nearestCount )
|
|
|
|
{
|
|
|
|
if( m_pMemento )
|
|
|
|
m_pMemento->addData( s_pMetaObject, PMNearestCountID, m_nearestCount );
|
|
|
|
m_nearestCount = c;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void PMRadiosity::setNormal( bool n )
|
|
|
|
{
|
|
|
|
if( n != m_normal )
|
|
|
|
{
|
|
|
|
if( m_pMemento )
|
|
|
|
m_pMemento->addData( s_pMetaObject, PMNormalID, m_normal );
|
|
|
|
m_normal = n;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void PMRadiosity::setPretraceStart( double ps )
|
|
|
|
{
|
|
|
|
if ( ps < m_pretraceEnd )
|
|
|
|
{
|
|
|
|
kdError( PMArea ) << "Pretrace Start < Pretrace End in PMRadiosity::setPretraceStart\n";
|
|
|
|
ps = m_pretraceEnd;
|
|
|
|
}
|
|
|
|
|
|
|
|
if( ps != m_pretraceStart )
|
|
|
|
{
|
|
|
|
if( m_pMemento )
|
|
|
|
m_pMemento->addData( s_pMetaObject, PMPretraceStartID, m_pretraceStart );
|
|
|
|
m_pretraceStart = ps;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void PMRadiosity::setPretraceEnd( double pe )
|
|
|
|
{
|
|
|
|
if ( pe > m_pretraceStart )
|
|
|
|
{
|
|
|
|
kdError( PMArea ) << "Pretrace End > Pretrace Start in PMRadiosity::setPretraceEnd\n";
|
|
|
|
pe = m_pretraceStart;
|
|
|
|
}
|
|
|
|
|
|
|
|
if( pe != m_pretraceEnd )
|
|
|
|
{
|
|
|
|
if( m_pMemento )
|
|
|
|
m_pMemento->addData( s_pMetaObject, PMPretraceEndID, m_pretraceEnd );
|
|
|
|
m_pretraceEnd = pe;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void PMRadiosity::setRecursionLimit( int c )
|
|
|
|
{
|
|
|
|
if( c != m_recursionLimit )
|
|
|
|
{
|
|
|
|
if( m_pMemento )
|
|
|
|
m_pMemento->addData( s_pMetaObject, PMRecursionLimitID, m_recursionLimit );
|
|
|
|
m_recursionLimit = c;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
PMDialogEditBase* PMRadiosity::editWidget( TQWidget* parent ) const
|
|
|
|
{
|
|
|
|
return new PMRadiosityEdit( parent );
|
|
|
|
}
|
|
|
|
|
|
|
|
void PMRadiosity::restoreMemento( PMMemento* s )
|
|
|
|
{
|
|
|
|
PMMementoDataIterator it( s );
|
|
|
|
PMMementoData* data;
|
|
|
|
|
|
|
|
for( ; it.current( ); ++it )
|
|
|
|
{
|
|
|
|
data = it.current( );
|
|
|
|
if( data->objectType( ) == s_pMetaObject )
|
|
|
|
{
|
|
|
|
switch( data->valueID( ) )
|
|
|
|
{
|
|
|
|
case PMAdcBailoutID:
|
|
|
|
setAdcBailout( data->doubleData( ) );
|
|
|
|
break;
|
|
|
|
case PMAlwaysSampleID:
|
|
|
|
setAlwaysSample( data->boolData( ) );
|
|
|
|
break;
|
|
|
|
case PMBrightnessID:
|
|
|
|
setBrightness( data->doubleData( ) );
|
|
|
|
break;
|
|
|
|
case PMCountID:
|
|
|
|
setCount( data->intData( ) );
|
|
|
|
break;
|
|
|
|
case PMErrorBoundID:
|
|
|
|
setErrorBound( data->doubleData( ) );
|
|
|
|
break;
|
|
|
|
case PMGrayThresholdID:
|
|
|
|
setGrayThreshold( data->doubleData( ) );
|
|
|
|
break;
|
|
|
|
case PMLowErrorFactorID:
|
|
|
|
setLowErrorFactor( data->doubleData( ) );
|
|
|
|
break;
|
|
|
|
case PMMaxSampleID:
|
|
|
|
setMaxSample( data->doubleData( ) );
|
|
|
|
break;
|
|
|
|
case PMMediaID:
|
|
|
|
setMedia( data->boolData( ) );
|
|
|
|
break;
|
|
|
|
case PMMinimumReuseID:
|
|
|
|
setMinimumReuse( data->doubleData( ) );
|
|
|
|
break;
|
|
|
|
case PMNearestCountID:
|
|
|
|
setNearestCount( data->intData( ) );
|
|
|
|
break;
|
|
|
|
case PMNormalID:
|
|
|
|
setNormal( data->boolData( ) );
|
|
|
|
break;
|
|
|
|
case PMPretraceStartID:
|
|
|
|
setPretraceStart( data->doubleData( ) );
|
|
|
|
break;
|
|
|
|
case PMPretraceEndID:
|
|
|
|
setPretraceEnd( data->doubleData( ) );
|
|
|
|
break;
|
|
|
|
case PMRecursionLimitID:
|
|
|
|
setRecursionLimit( data->intData( ) );
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
kdError( PMArea ) << "Wrong ID in PMRadiosity::restoreMemento\n";
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
Base::restoreMemento( s );
|
|
|
|
}
|