MODULE = Ogre     PACKAGE = Ogre::Pass

### note: Material, Technique, and Pass have a lot of methods in common

bool
Pass::isProgrammable()

bool
Pass::hasVertexProgram()

bool
Pass::hasFragmentProgram()

bool
Pass::hasShadowCasterVertexProgram()

bool
Pass::hasShadowReceiverVertexProgram()

bool
Pass::hasShadowReceiverFragmentProgram()

unsigned short
Pass::getIndex()

void
Pass::setName(String name)

String
Pass::getName()

void
Pass::setAmbient(...)
  CODE:
    // xxx: also duplicated this in several places (also Light.xs)
    if (items == 2 && sv_isobject(ST(1)) && sv_derived_from(ST(1), "Ogre::Colour")) {
        ColourValue *colour = (ColourValue *) SvIV((SV *) SvRV(ST(1)));   // TMOGRE_IN
        THIS->setAmbient(*colour);
    }
    else if (items == 4) {
        THIS->setAmbient((Real)SvNV(ST(1)), (Real)SvNV(ST(2)), (Real)SvNV(ST(3)));
    }
    else {
        croak("Usage: Ogre::Pass::setAmbient(THIS, col) or (THIS, r, g, b)\n");
    }

void
Pass::setDiffuse(...)
  CODE:
    // xxx: also duplicated this in several places (also Light.xs)
    if (items == 2 && sv_isobject(ST(1)) && sv_derived_from(ST(1), "Ogre::Colour")) {
        ColourValue *colour = (ColourValue *) SvIV((SV *) SvRV(ST(1)));   // TMOGRE_IN
        THIS->setDiffuse(*colour);
    }
    else if (items == 5) {
        THIS->setDiffuse((Real)SvNV(ST(1)), (Real)SvNV(ST(2)), (Real)SvNV(ST(3)), (Real)SvNV(ST(4)));
    }
    else {
        croak("Usage: Ogre::Pass::setDiffuse(THIS, col) or (THIS, r, g, b, a)\n");
    }

void
Pass::setSpecular(...)
  CODE:
    // xxx: also duplicated this in several places (also Light.xs)
    if (items == 2 && sv_isobject(ST(1)) && sv_derived_from(ST(1), "Ogre::Colour")) {
        ColourValue *colour = (ColourValue *) SvIV((SV *) SvRV(ST(1)));   // TMOGRE_IN
        THIS->setSpecular(*colour);
    }
    else if (items == 5) {
        THIS->setSpecular((Real)SvNV(ST(1)), (Real)SvNV(ST(2)), (Real)SvNV(ST(3)), (Real)SvNV(ST(4)));
    }
    else {
        croak("Usage: Ogre::Pass::setSpecular(THIS, col) or (THIS, r, g, b, a)\n");
    }

void
Pass::setShininess(Real val)

void
Pass::setSelfIllumination(...)
  CODE:
    // xxx: also duplicated this in several places (also Light.xs)
    if (items == 2 && sv_isobject(ST(1)) && sv_derived_from(ST(1), "Ogre::Colour")) {
        ColourValue *colour = (ColourValue *) SvIV((SV *) SvRV(ST(1)));   // TMOGRE_IN
        THIS->setSelfIllumination(*colour);
    }
    else if (items == 4) {
        THIS->setSelfIllumination((Real)SvNV(ST(1)), (Real)SvNV(ST(2)), (Real)SvNV(ST(3)));
    }
    else {
        croak("Usage: Ogre::Pass::setSelfIllumination(THIS, col) or (THIS, r, g, b)\n");
    }

void
Pass::setVertexColourTracking(int tracking)
  C_ARGS:
    (TrackVertexColourType)tracking

Real
Pass::getPointSize()

void
Pass::setPointSize(Real ps)

void
Pass::setPointSpritesEnabled(bool enabled)

bool
Pass::getPointSpritesEnabled()

void
Pass::setPointAttenuation(bool enabled, Real constant=0.0f, Real linear=1.0f, Real quadratic=0.0f)

bool
Pass::isPointAttenuationEnabled()

Real
Pass::getPointAttenuationConstant()

Real
Pass::getPointAttenuationLinear()

Real
Pass::getPointAttenuationQuadratic()

void
Pass::setPointMinSize(Real min)

Real
Pass::getPointMinSize()

void
Pass::setPointMaxSize(Real max)

Real
Pass::getPointMaxSize()

ColourValue *
Pass::getAmbient()
  CODE:
    RETVAL = new ColourValue;
    *RETVAL = THIS->getAmbient();
  OUTPUT:
    RETVAL

ColourValue *
Pass::getDiffuse()
  CODE:
    RETVAL = new ColourValue;
    *RETVAL = THIS->getDiffuse();
  OUTPUT:
    RETVAL

ColourValue *
Pass::getSpecular()
  CODE:
    RETVAL = new ColourValue;
    *RETVAL = THIS->getSpecular();
  OUTPUT:
    RETVAL


ColourValue *
Pass::getSelfIllumination()
  CODE:
    RETVAL = new ColourValue;
    *RETVAL = THIS->getSelfIllumination();
  OUTPUT:
    RETVAL

Real
Pass::getShininess()

int
Pass::getVertexColourTracking()

TextureUnitState *
Pass::createTextureUnitState(...)
  CODE:
    if (items == 1) {
        RETVAL = THIS->createTextureUnitState();
    }
    else if (items >= 2) {
        char * xstmpchr = (char *) SvPV_nolen(ST(1));
        String textureName = xstmpchr;

        unsigned short texCoordSet = 0;
        if (items == 3) texCoordSet = (unsigned short)SvUV(ST(2));

        RETVAL = THIS->createTextureUnitState(textureName, texCoordSet);
    }
  OUTPUT:
    RETVAL

void
Pass::addTextureUnitState(TextureUnitState *state)

TextureUnitState *
Pass::getTextureUnitState(...)
  CODE:
    // xxx: I duplicate this in several places... but how do I factor it out?
    if (looks_like_number(ST(1))) {
        unsigned short index = (unsigned short)SvUV(ST(1));
        RETVAL = THIS->getTextureUnitState(index);
    }
    else {
        char * xstmpchr = (char *) SvPV_nolen(ST(1));
        String name = xstmpchr;
        RETVAL = THIS->getTextureUnitState(name);
    }
  OUTPUT:
    RETVAL

unsigned short
Pass::getTextureUnitStateIndex(const TextureUnitState *state)

## TextureUnitStateIterator Pass::getTextureUnitStateIterator()
## ConstTextureUnitStateIterator Pass::getTextureUnitStateIterator()

void
Pass::removeTextureUnitState(unsigned short index)

void
Pass::removeAllTextureUnitStates()

unsigned short
Pass::getNumTextureUnitStates()

void
Pass::setSceneBlending(...)
  CODE:
    if (items == 2) {
        THIS->setSceneBlending((SceneBlendType)SvIV(ST(1)));
    }
    else if (items == 3) {
        THIS->setSceneBlending((SceneBlendFactor)SvIV(ST(1)), (SceneBlendFactor)SvIV(ST(2)));
    }

int
Pass::getSourceBlendFactor()

int
Pass::getDestBlendFactor()

bool
Pass::isTransparent()

void
Pass::setDepthCheckEnabled(bool enabled)

bool
Pass::getDepthCheckEnabled()

void
Pass::setDepthWriteEnabled(bool enabled)

bool
Pass::getDepthWriteEnabled()

void
Pass::setDepthFunction(int func)
  C_ARGS:
    (CompareFunction)func

int
Pass::getDepthFunction()

void
Pass::setColourWriteEnabled(bool enabled)

bool
Pass::getColourWriteEnabled()

void
Pass::setCullingMode(int mode)
  C_ARGS:
    (CullingMode)mode

int
Pass::getCullingMode()

void
Pass::setManualCullingMode(int mode)
  C_ARGS:
    (ManualCullingMode)mode

int
Pass::getManualCullingMode()

void
Pass::setLightingEnabled(bool enabled)

bool
Pass::getLightingEnabled()

void
Pass::setMaxSimultaneousLights(unsigned short maxLights)

unsigned short
Pass::getMaxSimultaneousLights()

void
Pass::setStartLight(unsigned short startLight)

unsigned short
Pass::getStartLight()

void
Pass::setShadingMode(int mode)
  C_ARGS:
    (ShadeOptions)mode

int
Pass::getShadingMode()

void
Pass::setPolygonMode(int mode)
  C_ARGS:
    (PolygonMode)mode

int
Pass::getPolygonMode()

void
Pass::setFog(bool overrideScene, int mode=FOG_NONE, const ColourValue *colour=&ColourValue::White, Real expDensity=0.001, Real linearStart=0.0, Real linearEnd=1.0)
  C_ARGS:
    overrideScene, (FogMode)mode, *colour, expDensity, linearStart, linearEnd

bool
Pass::getFogOverride()

int
Pass::getFogMode()

ColourValue *
Pass::getFogColour()
  CODE:
    RETVAL = new ColourValue;
    *RETVAL = THIS->getFogColour();
  OUTPUT:
    RETVAL

Real
Pass::getFogStart()

Real
Pass::getFogEnd()

Real
Pass::getFogDensity()

void
Pass::setDepthBias(float constantBias, float slopeScaleBias=0.0f)

float
Pass::getDepthBiasConstant()

float
Pass::getDepthBiasSlopeScale()

void
Pass::setAlphaRejectSettings(int func, unsigned char value)
  C_ARGS:
    (CompareFunction)func, value

void
Pass::setAlphaRejectFunction(int func)
  C_ARGS:
    (CompareFunction)func

void
Pass::setAlphaRejectValue(unsigned char val)

int
Pass::getAlphaRejectFunction()

unsigned char
Pass::getAlphaRejectValue()

void
Pass::setIteratePerLight(bool enabled, bool onlyForOneLightType=true, int lightType=Light::LT_POINT)
  C_ARGS:
    enabled, onlyForOneLightType, (Light::LightTypes) lightType

bool
Pass::getIteratePerLight()

bool
Pass::getRunOnlyForOneLightType()

int
Pass::getOnlyLightType()

void
Pass::setLightCountPerIteration(unsigned short c)

unsigned short
Pass::getLightCountPerIteration()

Technique *
Pass::getParent()

String
Pass::getResourceGroup()

# note: vertex program means "GpuProgram"
void
Pass::setVertexProgram(String name, bool resetParams=true)

void
Pass::setVertexProgramParameters(GpuProgramParameters * params)
  CODE:
    GpuProgramParametersSharedPtr paramsptr = GpuProgramParametersSharedPtr(params);
    THIS->setVertexProgramParameters(paramsptr);

String
Pass::getVertexProgramName()

GpuProgramParameters *
Pass::getVertexProgramParameters()
  CODE:
    RETVAL = THIS->getVertexProgramParameters().getPointer();
  OUTPUT:
    RETVAL

GpuProgram *
Pass::getVertexProgram()
  CODE:
    RETVAL = THIS->getVertexProgram().getPointer();
  OUTPUT:
    RETVAL

void
Pass::setShadowCasterVertexProgram(String name)

void
Pass::setShadowCasterVertexProgramParameters(GpuProgramParameters *params)
  CODE:
    GpuProgramParametersSharedPtr paramsptr = GpuProgramParametersSharedPtr(params);
    THIS->setShadowCasterVertexProgramParameters(paramsptr);

String
Pass::getShadowCasterVertexProgramName()

GpuProgramParameters *
Pass::getShadowCasterVertexProgramParameters()
  CODE:
    RETVAL = THIS->getShadowCasterVertexProgramParameters().getPointer();
  OUTPUT:
    RETVAL

GpuProgram *
Pass::getShadowCasterVertexProgram()
  CODE:
    RETVAL = THIS->getShadowCasterVertexProgram().getPointer();
  OUTPUT:
    RETVAL

void
Pass::setShadowReceiverVertexProgram(String name)

void
Pass::setShadowReceiverVertexProgramParameters(GpuProgramParameters *params)
  CODE:
    GpuProgramParametersSharedPtr paramsptr = GpuProgramParametersSharedPtr(params);
    THIS->setShadowReceiverVertexProgramParameters(paramsptr);

void
Pass::setShadowReceiverFragmentProgram(String name)

void
Pass::setShadowReceiverFragmentProgramParameters(GpuProgramParameters *params)
  CODE:
    GpuProgramParametersSharedPtr paramsptr = GpuProgramParametersSharedPtr(params);
    THIS->setShadowReceiverFragmentProgramParameters(paramsptr);

String
Pass::getShadowReceiverVertexProgramName()

GpuProgramParameters *
Pass::getShadowReceiverVertexProgramParameters()
  CODE:
    RETVAL = THIS->getShadowReceiverVertexProgramParameters().getPointer();
  OUTPUT:
    RETVAL

GpuProgram *
Pass::getShadowReceiverVertexProgram()
  CODE:
    RETVAL = THIS->getShadowReceiverVertexProgram().getPointer();
  OUTPUT:
    RETVAL

String
Pass::getShadowReceiverFragmentProgramName()

GpuProgramParameters *
Pass::getShadowReceiverFragmentProgramParameters()
  CODE:
    RETVAL = THIS->getShadowReceiverFragmentProgramParameters().getPointer();
  OUTPUT:
    RETVAL

GpuProgram *
Pass::getShadowReceiverFragmentProgram()
  CODE:
    RETVAL = THIS->getShadowReceiverFragmentProgram().getPointer();
  OUTPUT:
    RETVAL

void
Pass::setFragmentProgram(String name, bool resetParams=true)

void
Pass::setFragmentProgramParameters(GpuProgramParameters *params)
  CODE:
    GpuProgramParametersSharedPtr paramsptr = GpuProgramParametersSharedPtr(params);
    THIS->setFragmentProgramParameters(paramsptr);

String
Pass::getFragmentProgramName()

GpuProgramParameters *
Pass::getFragmentProgramParameters()
  CODE:
    RETVAL = THIS->getFragmentProgramParameters().getPointer();
  OUTPUT:
    RETVAL

GpuProgram *
Pass::getFragmentProgram()
  CODE:
    RETVAL = THIS->getFragmentProgram().getPointer();
  OUTPUT:
    RETVAL

bool
Pass::isLoaded()

uint32
Pass::getHash()

void
Pass::setTextureFiltering(int filterType)
  C_ARGS:
    (TextureFilterOptions)filterType

void
Pass::setTextureAnisotropy(unsigned int maxAniso)

void
Pass::queueForDeletion()

bool
Pass::isAmbientOnly()

void
Pass::setPassIterationCount(size_t count)

size_t
Pass::getPassIterationCount()

## bool Pass::applyTextureAliases(const AliasTextureNamePairList &aliasList, const bool apply=true)