You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
253 lines
7.3 KiB
253 lines
7.3 KiB
/*==LICENSE==* |
|
|
|
CyanWorlds.com Engine - MMOG client, server and tools |
|
Copyright (C) 2011 Cyan Worlds, Inc. |
|
|
|
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 3 of the License, or |
|
(at your option) any later version. |
|
|
|
This program is distributed in the hope that it will be useful, |
|
but WITHOUT ANY WARRANTY; without even the implied warranty of |
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|
GNU General Public License for more details. |
|
|
|
You should have received a copy of the GNU General Public License |
|
along with this program. If not, see <http://www.gnu.org/licenses/>. |
|
|
|
You can contact Cyan Worlds, Inc. by email legal@cyan.com |
|
or by snail mail at: |
|
Cyan Worlds, Inc. |
|
14617 N Newport Hwy |
|
Mead, WA 99021 |
|
|
|
*==LICENSE==*/ |
|
#ifndef hsGMatState_inc |
|
#define hsGMatState_inc |
|
|
|
#include "hsColorRGBA.h" |
|
|
|
class hsStream; |
|
|
|
class hsGMatState { |
|
public: |
|
enum hsGMatBlendFlags { |
|
kBlendTest = 0x1, // dev |
|
// Rest of blends are mutually exclusive |
|
kBlendAlpha = 0x2, // dev |
|
kBlendMult = 0x4, // dev |
|
kBlendAdd = 0x8, // dev |
|
kBlendAddColorTimesAlpha = 0x10, // dev |
|
kBlendAntiAlias = 0x20, |
|
kBlendDetail = 0x40, |
|
kBlendNoColor = 0x80, // dev |
|
kBlendMADD = 0x100, |
|
kBlendDot3 = 0x200, |
|
kBlendAddSigned = 0x400, |
|
kBlendAddSigned2X = 0x800, |
|
kBlendMask = kBlendAlpha |
|
| kBlendMult |
|
| kBlendAdd |
|
| kBlendAddColorTimesAlpha |
|
| kBlendDetail |
|
| kBlendMADD |
|
| kBlendDot3 |
|
| kBlendAddSigned |
|
| kBlendAddSigned2X, |
|
kBlendInvertAlpha = 0x1000, // dev |
|
kBlendInvertColor = 0x2000, // dev |
|
kBlendAlphaMult = 0x4000, |
|
kBlendAlphaAdd = 0x8000, |
|
kBlendNoVtxAlpha = 0x10000, |
|
kBlendNoTexColor = 0x20000, |
|
kBlendNoTexAlpha = 0x40000, |
|
kBlendInvertVtxAlpha = 0x80000, // Invert ONLY the vertex alpha source |
|
kBlendAlphaAlways = 0x100000, // Alpha test always passes (even for alpha=0). |
|
kBlendInvertFinalColor = 0x200000, |
|
kBlendInvertFinalAlpha = 0x400000, |
|
kBlendEnvBumpNext = 0x800000, |
|
kBlendSubtract = 0x1000000, |
|
kBlendRevSubtract = 0x2000000, |
|
kBlendAlphaTestHigh = 0x4000000 |
|
}; |
|
enum hsGMatClampFlags { |
|
|
|
kClampTextureU = 0x1, // dev |
|
kClampTextureV = 0x2, // dev |
|
kClampTexture = 0x3 // dev |
|
}; |
|
|
|
enum hsGMatShadeFlags { |
|
|
|
kShadeSoftShadow = 0x1, // view, dev |
|
kShadeNoProjectors = 0x2, // projector |
|
kShadeEnvironMap = 0x4, // dev, load |
|
kShadeVertexShade = 0x20, // dev |
|
kShadeNoShade = 0x40, // view,dev |
|
kShadeBlack = kShadeNoShade, |
|
kShadeSpecular = 0x80, // view, dev |
|
//kShadeNoFog = 0x100, // dev |
|
kShadeWhite = 0x200, |
|
kShadeSpecularAlpha = 0x400, |
|
kShadeSpecularColor = 0x800, |
|
kShadeSpecularHighlight = 0x1000, |
|
kShadeVertColShade = 0x2000, |
|
kShadeInherit = 0x4000, |
|
kShadeIgnoreVtxIllum = 0x8000, |
|
kShadeEmissive = 0x10000, // Moved here 8.27 mcn. Only really sane to use with kMiscEndPassHere |
|
kShadeReallyNoFog = 0x20000 |
|
}; |
|
|
|
enum hsGMatZFlags { |
|
kZIncLayer = 0x1, // dev |
|
kZClearZ = 0x4, // dev |
|
kZNoZRead = 0x8, // dev |
|
kZNoZWrite = 0x10, |
|
kZMask = kZNoZWrite | kZClearZ | kZNoZRead, |
|
kZLODBias = 0x20 |
|
}; |
|
|
|
enum hsGMatMiscFlags { |
|
kMiscWireFrame = 0x1, // dev (running out of bits) |
|
kMiscDrawMeshOutlines = 0x2, // dev, currently unimplemented |
|
kMiscTwoSided = 0x4, // view,dev |
|
kMiscDrawAsSplats = 0x8, // dev? bwt |
|
kMiscAdjustPlane = 0x10, |
|
kMiscAdjustCylinder = 0x20, |
|
kMiscAdjustSphere = 0x40, |
|
kMiscAdjust = kMiscAdjustPlane | kMiscAdjustCylinder| kMiscAdjustSphere, |
|
kMiscTroubledLoner = 0x80, |
|
kMiscBindSkip = 0x100, |
|
kMiscBindMask = 0x200, |
|
kMiscBindNext = 0x400, |
|
kMiscLightMap = 0x800, |
|
kMiscUseReflectionXform = 0x1000, // Use the calculated reflection environment |
|
// texture transform instead of layer->GetTransform() |
|
kMiscPerspProjection = 0x2000, |
|
kMiscOrthoProjection = 0x4000, |
|
kMiscProjection = kMiscPerspProjection | kMiscOrthoProjection, |
|
|
|
kMiscRestartPassHere = 0x8000, // Tells pipeline to start a new pass beginning with this layer |
|
// Kinda like troubledLoner, but only cuts off lower layers, not |
|
// higher ones (kMiscBindNext sometimes does this by implication) |
|
|
|
kMiscBumpLayer = 0x10000, |
|
kMiscBumpDu = 0x20000, |
|
kMiscBumpDv = 0x40000, |
|
kMiscBumpDw = 0x80000, |
|
kMiscBumpChans = kMiscBumpDu | kMiscBumpDv | kMiscBumpDw, |
|
|
|
kMiscNoShadowAlpha = 0x100000, |
|
kMiscUseRefractionXform = 0x200000, // Use a refraction-like hack. |
|
kMiscCam2Screen = 0x400000, // Expects tex coords to be XYZ in camera space. Does a cam to screen (not NDC) projection |
|
// and swaps Z with W, so that the texture projection can produce projected 2D screen coordinates. |
|
|
|
kAllMiscFlags = 0xffffffff |
|
}; |
|
enum StateIdx { |
|
kBlend, |
|
kClamp, |
|
kShade, |
|
kZ, |
|
kMisc |
|
}; |
|
UInt32 fBlendFlags; |
|
UInt32 fClampFlags; |
|
UInt32 fShadeFlags; |
|
UInt32 fZFlags; |
|
UInt32 fMiscFlags; |
|
|
|
static hsBool Differs(UInt32 mine, UInt32 hers, UInt32 mask) |
|
{ |
|
return (mine & mask) ^ (hers & mask); |
|
} |
|
|
|
static hsBool Differs(UInt32 mine, UInt32 hers) |
|
{ |
|
return mine ^ hers; |
|
} |
|
|
|
hsBool operator!=(const hsGMatState& other) |
|
{ |
|
return ((fBlendFlags ^ other.fBlendFlags) |
|
| (fClampFlags ^ other.fClampFlags) |
|
| (fShadeFlags ^ other.fShadeFlags) |
|
| (fZFlags ^ other.fZFlags) |
|
| (fMiscFlags ^ other.fMiscFlags)); |
|
} |
|
UInt32 Value(int i) const |
|
{ |
|
switch(i) |
|
{ |
|
case kBlend: |
|
return fBlendFlags; |
|
case kClamp: |
|
return fClampFlags; |
|
case kShade: |
|
return fShadeFlags; |
|
case kZ: |
|
return fZFlags; |
|
case kMisc: |
|
return fMiscFlags; |
|
} |
|
hsAssert(false, "Bad param"); |
|
return fBlendFlags; |
|
} |
|
UInt32& operator[](const int i) |
|
{ |
|
switch(i) |
|
{ |
|
case kBlend: |
|
return fBlendFlags; |
|
case kClamp: |
|
return fClampFlags; |
|
case kShade: |
|
return fShadeFlags; |
|
case kZ: |
|
return fZFlags; |
|
case kMisc: |
|
return fMiscFlags; |
|
} |
|
hsAssert(false, "Bad param"); |
|
return fBlendFlags; |
|
} |
|
hsGMatState& operator|=(const hsGMatState& other) |
|
{ |
|
fBlendFlags |= other.fBlendFlags; |
|
fClampFlags |= other.fClampFlags; |
|
fShadeFlags |= other.fShadeFlags; |
|
fZFlags |= other.fZFlags; |
|
fMiscFlags |= other.fMiscFlags; |
|
return *this; |
|
} |
|
hsGMatState& operator+=(const hsGMatState& other) |
|
{ |
|
return operator|=(other); |
|
} |
|
hsGMatState& operator-=(const hsGMatState& other) |
|
{ |
|
fBlendFlags &= ~other.fBlendFlags; |
|
fClampFlags &= ~other.fClampFlags; |
|
fShadeFlags &= ~other.fShadeFlags; |
|
fZFlags &= ~other.fZFlags; |
|
fMiscFlags &= ~other.fMiscFlags; |
|
return *this; |
|
} |
|
|
|
inline void Read(hsStream* s); |
|
inline void Write(hsStream* s); |
|
|
|
hsGMatState(UInt32 blend=0, UInt32 clamp=0, UInt32 shade=0, UInt32 z=0, UInt32 misc=0) |
|
: fBlendFlags(blend), |
|
fClampFlags(clamp), |
|
fShadeFlags(shade), |
|
fZFlags(z), |
|
fMiscFlags(misc) {} |
|
void Reset() { fBlendFlags = fClampFlags = fShadeFlags = fZFlags = fMiscFlags = 0; } |
|
inline void Clear(const hsGMatState& state); |
|
inline void Composite(const hsGMatState& want, const hsGMatState& on, const hsGMatState& off); |
|
}; |
|
|
|
|
|
#endif // hsGMatState_inc
|
|
|