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

/*==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