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.
421 lines
16 KiB
421 lines
16 KiB
14 years ago
|
/*==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 __HSMAXLAYER_H
|
||
|
#define __HSMAXLAYER_H
|
||
|
|
||
|
#include <bmmlib.h>
|
||
|
#include "hsMaxLayerBase.h"
|
||
|
//#include "hsMaxMtlRes.h"
|
||
|
|
||
|
//=========================================================================================
|
||
|
// Flags and constants...
|
||
|
//=========================================================================================
|
||
|
|
||
|
// ParamBlock entries
|
||
|
#define PB_LAYER_CLIPU 0
|
||
|
#define PB_LAYER_CLIPV 1
|
||
|
#define PB_LAYER_CLIPW 2
|
||
|
#define PB_LAYER_CLIPH 3
|
||
|
#define PB_LAYER_JITTER 4
|
||
|
#define PB_LAYER_AMBIENT 5
|
||
|
#define PB_LAYER_COLOR 6
|
||
|
#define PB_LAYER_SHININESS 7
|
||
|
#define PB_LAYER_SHIN_STR 8
|
||
|
#define PB_LAYER_SELFI 9
|
||
|
#define PB_LAYER_OPAC 10
|
||
|
#define PB_LAYER_OPFALL 11
|
||
|
#define PB_LAYER_FILTER 12
|
||
|
#define PB_LAYER_WIRESZ 13
|
||
|
#define PB_LAYER_IOR 14
|
||
|
#define PB_LAYER_BOUNCE 15
|
||
|
#define PB_LAYER_STATFRIC 16
|
||
|
#define PB_LAYER_SLIDFRIC 17
|
||
|
#define PB_LAYER_DIMLEV 18
|
||
|
#define PB_LAYER_DIMMULT 19
|
||
|
#define PB_LAYER_MAPPERCENT 20
|
||
|
#define PB_LAYER_MIPMAPBLUR 21
|
||
|
#define PB_LAYER_LODBIAS 22
|
||
|
#define PB_LAYER_DETAILBIAS 23
|
||
|
#define PB_LAYER_DETAILMAX 24
|
||
|
#define PB_LAYER_ENVIRONMAPSIZE 25
|
||
|
#define LAYER_NPARAMS 26
|
||
|
|
||
|
#define HSMAX_LAYER_LOCK_AD 0x1
|
||
|
|
||
|
class hsMaxLayer;
|
||
|
class hsMaxLayerDlg;
|
||
|
|
||
|
static LRESULT CALLBACK HiliteWndProc( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam );
|
||
|
|
||
|
// which edit control enum
|
||
|
enum EditControl {Hc, Sc, Vc, Rc, Gc, Bc};
|
||
|
|
||
|
void GetBMName(BitmapInfo& bi, TSTR &fname);
|
||
|
|
||
|
//=========================================================================================
|
||
|
// BMSampler
|
||
|
//=========================================================================================
|
||
|
|
||
|
class BMSampler : public MapSampler {
|
||
|
Bitmap *bm;
|
||
|
hsMaxLayer *tex;
|
||
|
int alphaSource;
|
||
|
float u0,v0,u1,v1,ufac,vfac,ujit,vjit;
|
||
|
int bmw,bmh,clipx, clipy, cliph;
|
||
|
float fclipw,fcliph, fbmh, fbmw;
|
||
|
public:
|
||
|
BMSampler() { bm = NULL; }
|
||
|
void Init(hsMaxLayer *bmt);
|
||
|
int PlaceUV(ShadeContext& sc, float &u, float &v, int iu, int iv);
|
||
|
void PlaceUVFilter(ShadeContext& sc, float &u, float &v, int iu, int iv);
|
||
|
AColor Sample(ShadeContext& sc, float u,float v);
|
||
|
AColor SampleFilter(ShadeContext& sc, float u,float v, float du, float dv);
|
||
|
// float SampleMono(ShadeContext& sc, float u,float v);
|
||
|
// float SampleMonoFilter(ShadeContext& sc, float u,float v, float du, float dv);
|
||
|
};
|
||
|
|
||
|
//=========================================================================================
|
||
|
// BM\AlphaSampler
|
||
|
//=========================================================================================
|
||
|
class BMAlphaSampler : public MapSampler {
|
||
|
Bitmap *bm;
|
||
|
hsMaxLayer *tex;
|
||
|
float u0,v0,u1,v1,ufac,vfac,ujit,vjit;
|
||
|
int bmw,bmh,clipx, clipy, cliph;
|
||
|
float fclipw,fcliph, fbmh, fbmw;
|
||
|
public:
|
||
|
BMAlphaSampler() { bm = NULL; }
|
||
|
void Init(hsMaxLayer *bmt);
|
||
|
int PlaceUV(ShadeContext &sc, float &u, float &v, int iu, int iv);
|
||
|
void PlaceUVFilter(ShadeContext &sc, float &u, float &v, int iu, int iv);
|
||
|
AColor Sample(ShadeContext& sc, float u,float v) { return AColor(0,0,0,0);}
|
||
|
AColor SampleFilter(ShadeContext& sc, float u,float v, float du, float dv) { return AColor(0,0,0,0);}
|
||
|
float SampleMono(ShadeContext& sc, float u,float v);
|
||
|
float SampleMonoFilter(ShadeContext& sc, float u,float v, float du, float dv);
|
||
|
};
|
||
|
|
||
|
//=========================================================================================
|
||
|
// hsMaxLayerNotify... this calls hsMaxLayer::NotifyChanged when a bitmap changes
|
||
|
//=========================================================================================
|
||
|
|
||
|
class hsMaxLayerNotify : public BitmapNotify {
|
||
|
public:
|
||
|
void SetTex(hsMaxLayer *tx) { tex = tx; }
|
||
|
int Changed(ULONG flags);
|
||
|
|
||
|
private:
|
||
|
hsMaxLayer *tex;
|
||
|
};
|
||
|
|
||
|
//=========================================================================================
|
||
|
// hsMaxLayer: a material layer with (possibly) texture info, blending info and shading info
|
||
|
//=========================================================================================
|
||
|
|
||
|
class hsMaxLayer : public hsMaxLayerBase {
|
||
|
friend class hsMaxLayerPostLoad;
|
||
|
friend class hsMaxLayerDlg;
|
||
|
friend class BMSampler;
|
||
|
friend class BMAlphaSampler;
|
||
|
friend class BMCropper;
|
||
|
public:
|
||
|
hsMaxLayer();
|
||
|
~hsMaxLayer();
|
||
|
|
||
|
ParamDlg* CreateParamDlg(HWND hwMtlEdit, IMtlParams *imp);
|
||
|
void Update(TimeValue t, Interval& valid);
|
||
|
void Reset();
|
||
|
Interval Validity(TimeValue t) { Interval v; Update(t,v); return ivalid; }
|
||
|
TSTR GetFullName();
|
||
|
|
||
|
void SetOutputLevel(TimeValue t, float v) { }
|
||
|
void SetFilterType(int ft);
|
||
|
void SetAlphaSource(int as);
|
||
|
void SetEndCondition(int endcond) { endCond = endcond; }
|
||
|
void SetAlphaAsMono(BOOL onoff) { alphaAsMono = onoff; }
|
||
|
void SetAlphaAsRGB(BOOL onoff) { alphaAsRGB = onoff; }
|
||
|
void SetPremultAlpha(BOOL onoff) { premultAlpha = onoff; }
|
||
|
void SetMapName(TCHAR *name) {
|
||
|
bi.SetName(name);
|
||
|
FreeBitmap();
|
||
|
if (paramDlg)
|
||
|
ReloadBitmap();
|
||
|
}
|
||
|
void SetStartTime(TimeValue t) { startTime = t; }
|
||
|
void SetPlaybackRate(float r) { pbRate = r; }
|
||
|
|
||
|
void SetClipU(TimeValue t, float f) { clipu = f; pblock->SetValue( PB_LAYER_CLIPU, t, f); }
|
||
|
void SetClipV(TimeValue t, float f) { clipv = f; pblock->SetValue( PB_LAYER_CLIPV, t, f); }
|
||
|
void SetClipW(TimeValue t, float f) { clipw = f; pblock->SetValue( PB_LAYER_CLIPW, t, f); }
|
||
|
void SetClipH(TimeValue t, float f) { cliph = f; pblock->SetValue( PB_LAYER_CLIPH, t, f); }
|
||
|
void SetJitter(TimeValue t, float f) { cliph = f; pblock->SetValue( PB_LAYER_JITTER, t, f); }
|
||
|
|
||
|
int GetFilterType() { return filterType; }
|
||
|
int GetAlphaSource() { return alphaSource; }
|
||
|
int GetEndCondition() { return endCond; }
|
||
|
BOOL GetAlphaAsMono(BOOL onoff) { return alphaAsMono; }
|
||
|
BOOL GetAlphaAsRGB(BOOL onoff) { return alphaAsRGB; }
|
||
|
BOOL GetPremultAlpha(BOOL onoff) { return premultAlpha; }
|
||
|
TCHAR *GetMapName() { return (TCHAR *)bi.Name(); }
|
||
|
TimeValue GetStartTime() { return startTime; }
|
||
|
float GetPlaybackRate() { return pbRate; }
|
||
|
StdUVGen* GetUVGen() { return (StdUVGen*)uvGen; }
|
||
|
TextureOutput* GetTexout() { return 0; }
|
||
|
Bitmap *GetBitmap(TimeValue t) { LoadBitmap(t); return thebm; }
|
||
|
float GetClipU(TimeValue t) { return pblock->GetFloat( PB_LAYER_CLIPU, t); }
|
||
|
float GetClipV(TimeValue t) { return pblock->GetFloat( PB_LAYER_CLIPV, t); }
|
||
|
float GetClipW(TimeValue t) { return pblock->GetFloat( PB_LAYER_CLIPW, t); }
|
||
|
float GetClipH(TimeValue t) { return pblock->GetFloat( PB_LAYER_CLIPH, t); }
|
||
|
float GetJitter(TimeValue t) { return pblock->GetFloat( PB_LAYER_JITTER, t); }
|
||
|
void StuffCropValues(); // stuff new values into the cropping VFB
|
||
|
|
||
|
void UpdtSampler() {
|
||
|
mysamp.Init(this);
|
||
|
alphasamp.Init(this);
|
||
|
}
|
||
|
|
||
|
void NotifyChanged();
|
||
|
Bitmap* BuildBitmap(int size);
|
||
|
void FreeBitmap();
|
||
|
BMMRES LoadBitmap(TimeValue t);
|
||
|
int CalcFrame(TimeValue t);
|
||
|
void ScaleBitmapBumpAmt(float f);
|
||
|
void ReloadBitmap();
|
||
|
|
||
|
// Evaluate the color of map for the context.
|
||
|
RGBA EvalColor(ShadeContext& sc);
|
||
|
float EvalMono(ShadeContext& sc);
|
||
|
Point3 EvalNormalPerturb(ShadeContext& sc);
|
||
|
|
||
|
void DiscardTexHandle();
|
||
|
|
||
|
BOOL SupportTexDisplay() { return TRUE; }
|
||
|
void ActivateTexDisplay(BOOL onoff);
|
||
|
DWORD GetActiveTexHandle(TimeValue t, TexHandleMaker& thmaker);
|
||
|
void GetUVTransform(Matrix3 &uvtrans) { uvGen->GetUVTransform(uvtrans); }
|
||
|
int GetTextureTiling() { return uvGen->GetTextureTiling(); }
|
||
|
int GetUVWSource() { return uvGen->GetUVWSource(); }
|
||
|
UVGen *GetTheUVGen() { return uvGen; }
|
||
|
#ifdef MAXR3
|
||
|
int GetMapChannel () { return uvGen->GetMapChannel(); }
|
||
|
#endif // MAXR3
|
||
|
|
||
|
int RenderBegin(TimeValue t, ULONG flags) {
|
||
|
inRender = TRUE;
|
||
|
return 1;
|
||
|
}
|
||
|
int RenderEnd(TimeValue t) {
|
||
|
inRender = FALSE;
|
||
|
return 1;
|
||
|
}
|
||
|
int LoadMapFiles(TimeValue t) { LoadBitmap(t); return 1; }
|
||
|
void RenderBitmap(TimeValue t, Bitmap *bm, float scale3D, BOOL filter);
|
||
|
|
||
|
Class_ID ClassID() { return hsMaxLayerClassID; }
|
||
|
SClass_ID SuperClassID() { return TEXMAP_CLASS_ID; }
|
||
|
#ifdef HS_DEBUGGING
|
||
|
void GetClassName(TSTR& s) { s= GetString(IDS_DS_LAYER_DEBUG); }
|
||
|
#else
|
||
|
void GetClassName(TSTR& s) { s= "";}//GetString(IDS_DS_LAYER); }
|
||
|
#endif
|
||
|
void DeleteThis() { delete this; }
|
||
|
|
||
|
// Requirements
|
||
|
ULONG LocalRequirements(int subMtlNum);
|
||
|
|
||
|
int NumSubs() { return 2; }
|
||
|
Animatable* SubAnim(int i);
|
||
|
TSTR SubAnimName(int i);
|
||
|
int SubNumToRefNum(int subNum) { return subNum; }
|
||
|
void InitSlotType(int sType) { if (uvGen) uvGen->InitSlotType(sType); }
|
||
|
|
||
|
// From ref
|
||
|
int NumRefs() { return 2; }
|
||
|
RefTargetHandle GetReference(int i);
|
||
|
void SetReference(int i, RefTargetHandle rtarg);
|
||
|
|
||
|
RefTargetHandle Clone(RemapDir &remap = NoRemap());
|
||
|
RefResult NotifyRefChanged( Interval changeInt, RefTargetHandle hTarget,
|
||
|
PartID& partID, RefMessage message );
|
||
|
|
||
|
// From Animatable
|
||
|
void EnumAuxFiles(NameEnumCallback& nameEnum, DWORD flags) {
|
||
|
bi.EnumAuxFiles(nameEnum,flags);
|
||
|
}
|
||
|
int SetProperty(ULONG id, void *data);
|
||
|
void FreeAllBitmaps() {
|
||
|
FreeBitmap();
|
||
|
}
|
||
|
|
||
|
int GetFlag(ULONG f) { return (flags&f)?1:0; }
|
||
|
void SetFlag(ULONG f, ULONG val);
|
||
|
|
||
|
// from hsMaxLayerBase
|
||
|
BOOL KeyAtTime(int id,TimeValue t) { return pblock->KeyFrameAtTime(id,t); }
|
||
|
Color GetAmbient(int mtlNum=0, BOOL backFace=FALSE);
|
||
|
Color GetColor(int mtlNum=0, BOOL backFace=FALSE);
|
||
|
|
||
|
float GetShininess(int mtlNum=0, BOOL backFace=FALSE) { return 0.f; }
|
||
|
float GetShinStr(int mtlNum=0, BOOL backFace=FALSE) { return 0.f; }
|
||
|
float GetMapPercent(int mtlNum=0, BOOL backFace=FALSE) { return 0.f; }
|
||
|
float GetOpacity(int mtlNum=0, BOOL backFace=FALSE) { return 0.f; }
|
||
|
float GetMipMapBlur(int mtlNum=0, BOOL backFace=FALSE) { return pblock->GetFloat(PB_LAYER_MIPMAPBLUR, 0); }
|
||
|
float GetLODBias(int mtlNum=0, BOOL backFace=FALSE) { return pblock->GetFloat(PB_LAYER_LODBIAS, 0); }
|
||
|
int GetEnvironMapSize(int mtlNum=0, BOOL backFace=FALSE) { return 0; }
|
||
|
|
||
|
Color GetAmbient(TimeValue t) const;
|
||
|
Color GetColor(TimeValue t) const;
|
||
|
|
||
|
float GetShininess(TimeValue t) const;
|
||
|
float GetShinStr(TimeValue t) const;
|
||
|
float GetMapPercent(TimeValue t) const;
|
||
|
float GetOpacity(TimeValue t) const;
|
||
|
float GetMipMapBlur(TimeValue t) const;
|
||
|
float GetLODBias(TimeValue t) const;
|
||
|
float GetDetailDropoffStart(TimeValue t) const;
|
||
|
float GetDetailDropoffStop(TimeValue t) const;
|
||
|
float GetDetailMax(TimeValue t) const;
|
||
|
float GetDetailMin(TimeValue t) const;
|
||
|
int GetEnvironMapSize(TimeValue t) const;
|
||
|
|
||
|
int GetNumExplicitMipmaps() const { return mipmapInfo.Count(); }
|
||
|
TCHAR *GetExplicitMipmapName(int i) const { return mipmapOn[i] ? (TCHAR *)mipmapInfo[i].Name() : 0; }
|
||
|
BOOL ExplicitMipmapEnabled(int i) const { return mipmapOn[i]; }
|
||
|
int GetExplicitMipmapLevel(int i) const { return mipmapLevel[i]; }
|
||
|
|
||
|
BOOL GetDirty() const { return dirty; }
|
||
|
ULONG GetBlendFlags() const { return blendFlags; }
|
||
|
ULONG GetZFlags() const { return zFlags; }
|
||
|
ULONG GetShadeFlags() const { return shadeFlags; }
|
||
|
ULONG GetMiscFlags() const { return miscFlags; }
|
||
|
ProcType GetProcType() const { return procType; }
|
||
|
hsMatUsage GetUsage() const { return usageType; }
|
||
|
|
||
|
// Setting the things in hsMaxLayerBase
|
||
|
void SetShininess(float v, TimeValue t);
|
||
|
void SetShinStr(float v, TimeValue t);
|
||
|
void SetMapPercent(float v, TimeValue t);
|
||
|
void SetOpacity(float v, TimeValue t);
|
||
|
void SetAmbient(Color c, TimeValue t);
|
||
|
void SetColor(Color c, TimeValue t);
|
||
|
void SetMipMapBlur(float f, TimeValue t);
|
||
|
void SetLODBias(float f, TimeValue t);
|
||
|
void SetDetailDropoffStart(float f, TimeValue t);
|
||
|
void SetDetailDropoffStop(float f, TimeValue t);
|
||
|
void SetDetailMax(float f, TimeValue t);
|
||
|
void SetDetailMin(float f, TimeValue t);
|
||
|
void SetEnvironMapSize(int i, TimeValue t);
|
||
|
|
||
|
void SetNumExplicitMipmaps(int n);
|
||
|
void SetExplicitMipmapName(int i, const char *n) { mipmapInfo[i].SetName(n); }
|
||
|
void EnableExplicitMipmap(int i, BOOL state) { mipmapOn[i] = state; }
|
||
|
void SetExplicitMipmapLevel(int i, int l) { mipmapLevel[i] = l; }
|
||
|
|
||
|
void SetDirty(BOOL state) { dirty = state; }
|
||
|
void SetBlendFlag(int i, BOOL state);
|
||
|
void SetZFlag(int flag, BOOL state);
|
||
|
void SetShadeFlag(int flag, BOOL state);
|
||
|
void SetMiscFlag(int flag, BOOL state);
|
||
|
void SetProcType(ProcType type);
|
||
|
void SetUsage(hsMatUsage use);
|
||
|
void GuessUsage();
|
||
|
|
||
|
// IO
|
||
|
IOResult Save(ISave *isave);
|
||
|
IOResult Load(ILoad *iload);
|
||
|
|
||
|
// Colin Hack
|
||
|
BOOL GetApplyCrop() { return applyCrop; }
|
||
|
BOOL GetPlaceImage() { return placeImage; }
|
||
|
|
||
|
private:
|
||
|
UVGen *uvGen; // ref #0
|
||
|
IParamBlock *pblock; // ref #1
|
||
|
BitmapInfo bi;
|
||
|
TSTR bmName; // for loading old files only
|
||
|
Bitmap *thebm;
|
||
|
hsMaxLayerNotify bmNotify;
|
||
|
TexHandle *texHandle;
|
||
|
float pbRate;
|
||
|
TimeValue startTime;
|
||
|
Interval ivalid;
|
||
|
|
||
|
// Samplers
|
||
|
BMSampler mysamp;
|
||
|
BMAlphaSampler alphasamp;
|
||
|
|
||
|
BOOL applyCrop;
|
||
|
BOOL loadingOld;
|
||
|
BOOL placeImage;
|
||
|
BOOL randPlace;
|
||
|
int filterType;
|
||
|
int alphaSource;
|
||
|
int endCond;
|
||
|
int alphaAsMono;
|
||
|
int alphaAsRGB;
|
||
|
float clipu, clipv, clipw, cliph, jitter;
|
||
|
BOOL premultAlpha;
|
||
|
BOOL isNew;
|
||
|
BOOL loadFailed;
|
||
|
BOOL inRender;
|
||
|
hsMaxLayerDlg *paramDlg;
|
||
|
int texTime;
|
||
|
Interval texValid;
|
||
|
Interval clipValid;
|
||
|
float rumax,rumin,rvmax,rvmin;
|
||
|
|
||
|
// ADDED
|
||
|
ULONG flags;
|
||
|
|
||
|
Color ambient;
|
||
|
Color color;
|
||
|
|
||
|
float opacity;
|
||
|
float shine_str;
|
||
|
float shininess;
|
||
|
float mapPercent;
|
||
|
float mipMapBlur;
|
||
|
float lodBias;
|
||
|
float detailDropoffStart;
|
||
|
float detailDropoffStop;
|
||
|
float detailMax;
|
||
|
float detailMin;
|
||
|
int environMapSize;
|
||
|
|
||
|
BOOL dirty;
|
||
|
|
||
|
ULONG blendFlags;
|
||
|
ULONG zFlags;
|
||
|
ULONG shadeFlags;
|
||
|
ULONG miscFlags;
|
||
|
ProcType procType;
|
||
|
hsMatUsage usageType;
|
||
|
|
||
|
Tab<BitmapInfo> mipmapInfo; // references
|
||
|
Tab<BOOL> mipmapOn;
|
||
|
Tab<int> mipmapLevel;
|
||
|
};
|
||
|
|
||
|
#endif
|