/*
Copyright (C) 2010, Heikki Salo
All rights reserved.
Distributed under the BSD license:
http://www.opensource.org/licenses/bsd-license.php
*/
#include "stdafx.h"
#include "DPDeviceState.hpp"
void DPDeviceState::zeroOut()
{
depthStencilState = 0;
stencilRef = 0;
blendState = 0;
for (int i=0; i < 4; ++i)
blendFactor[i] = 0.0f;
sampleMask = 0xffffffff;
rasterizerState = 0;
samplerState = 0;
}
DPDeviceState::~DPDeviceState()
{
release();
}
void DPDeviceState::release()
{
SafeRelease(depthStencilState);
SafeRelease(blendState);
SafeRelease(rasterizerState);
SafeRelease(samplerState);
}
DPDeviceState::DPDeviceState()
{
zeroOut();
}
DPDeviceState::DPDeviceState(ID3D11DepthStencilState* state)
{
zeroOut();
depthStencilState = state;
DPBase::init(state);
}
DPDeviceState::DPDeviceState(ID3D11BlendState* state)
{
zeroOut();
blendState = state;
DPBase::init(state);
}
DPDeviceState::DPDeviceState(ID3D11RasterizerState* state)
{
zeroOut();
rasterizerState = state;
DPBase::init(state);
}
DPDeviceState::DPDeviceState(ID3D11SamplerState* state)
{
zeroOut();
samplerState = state;
DPBase::init(state);
}
DPDeviceState* DPDeviceState::combine(DPDeviceState& source)
{
DPDeviceState* depthResult = 0;
DPDeviceState* blendResult = 0;
DPDeviceState* rasterizerResult = 0;
DPDeviceState* samplerResult = 0;
//Depth stencil.
if (depthStencilState && source.depthStencilState)
DPThrow("Both states have depth stencil");
depthResult = depthStencilState ? this : &source;
//Blend state.
if (blendState && source.blendState)
DPThrow("Both states have blend state");
blendResult = blendState ? this : &source;
//Rasterizer state.
if (rasterizerState && source.rasterizerState)
DPThrow("Both states have rasterizer state");
rasterizerResult = rasterizerState ? this : &source;
//Sampler state
if (samplerState && source.samplerState)
DPThrow("Both states have sampler state");
samplerResult = samplerState ? this : &source;
DPDeviceState* resultState = new DPDeviceState();
if (depthResult->depthStencilState) {
resultState->depthStencilState = depthResult->depthStencilState;
resultState->depthStencilState->AddRef();
resultState->stencilRef = depthResult->stencilRef;
}
if (blendResult->blendState) {
resultState->blendState = blendResult->blendState;
resultState->blendState->AddRef();
memcpy(resultState->blendFactor, blendResult->blendFactor, sizeof(blendFactor));
resultState->sampleMask = blendResult->sampleMask;
}
if (rasterizerResult->rasterizerState) {
resultState->rasterizerState = rasterizerResult->rasterizerState;
resultState->rasterizerState->AddRef();
}
if (samplerResult->samplerState) {
resultState->samplerState = samplerResult->samplerState;
resultState->samplerState->AddRef();
}
return resultState;
}
void ExportDPDeviceState()
{
using namespace boost::python;
class_<DPDeviceState, boost::noncopyable>("DPDeviceState")
.def("release", &DPDeviceState::release)
.def("combine", &DPDeviceState::combine, return_value_policy<manage_new_object>())
.def("hasDepthStencilState", &DPDeviceState::hasDepthStencilState)
.def("hasBlendState", &DPDeviceState::hasBlendState)
.def("hasRasterizerState", &DPDeviceState::hasRasterizerState)
.def("hasSamplerState", &DPDeviceState::hasSamplerState)
.def("setStencilRef", &DPDeviceState::setStencilRef)
.def("getStencilRef", &DPDeviceState::getStencilRef)
.def("getBlendFactor", &DPDeviceState::getBlendFactorPy)
.def("setBlendFactor", &DPDeviceState::setBlendFactorPy)
.def("getSampleMask", &DPDeviceState::getSampleMask)
.def("setSampleMask", &DPDeviceState::setSampleMask)
;
}