source: GTP/trunk/App/Demos/Illum/Shark3D/version164x12u/IllumDemo/src/gtp_shader/gtp_shader_createtex.cpp @ 2196

Revision 2196, 11.2 KB checked in by szirmay, 17 years ago (diff)
Line 
1///////////////////////////////////////////////////////////////////////////////
2//
3//      ##  ######
4//       ######  ###
5//  ## ###############        Shark 3D Engine (www.shark3d.com)
6//   ########## # # #
7//    ########                Copyright (c) 1996-2006 Spinor GmbH.
8//   ######### # # #          All rights reserved.
9//  ##   ##########
10//      ##
11//
12///////////////////////////////////////////////////////////////////////////////
13
14//@cpp
15
16#include "gtp_shader_createtex.h"
17#include "../../interf/eng_gfxvar.h"
18#include "../../util/eng_util_gfxutil.h"
19#include "../../util/eng_util_shaderutil.h"
20#include "../../../drv/interf/drv_vartypes.h"
21#include "../../../drv/util/drv_util_varutil.h"
22#include "../../../util/snk/util_snk_extractutil.h"
23
24///////////////////////////////////////////////////////////////////////////////
25/*@{
26
27@declare{shadercomp.class}{eng_shader_std.directtexchan}{}
28
29This component writes a reference to a texture
30into a texture channel variable.
31See also @ref{prog_man.shader.texture_channels}.
32@p
33
34@}*/
35///////////////////////////////////////////////////////////////////////////////
36
37S3D_UTIL_RTTI_TABLE_DEFINE_BEGIN(gtp_ShaderCreateTex)
38S3D_UTIL_RTTI_TABLE_DEFINE_BASE(s3d_CEngShader)
39S3D_UTIL_RTTI_TABLE_DEFINE_BASE(s3d_CCompUtilUniqueBase)
40S3D_UTIL_RTTI_TABLE_DEFINE_BASE(s3d_CCompSetup)
41S3D_UTIL_RTTI_TABLE_DEFINE_END
42
43gtp_ShaderCreateTex::gtp_ShaderCreateTex()
44{
45}
46
47void gtp_ShaderCreateTex::SetupInit(
48        s3d_CUtilMsgHandler *MsgHandler, s3d_CUtilStr_cr Info,
49        s3d_CCompSuppl *FetchSuppl, s3d_CUtilSnkChunk *Param)
50{
51    m_Data = S3D_SYS_NEW gtp_ShaderCreateTexData;
52
53    s3d_CUtilSnkExtract SnkExtract;
54    SnkExtract.Assign(MsgHandler, Param);
55    m_Data->m_Info = SnkExtract.GetInfo();
56
57    /*@{ @declare{shadercomp.param}{eng_shader_std.directtexchan.env}{$ [str]}
58        See @ident{comp}{eng_shader_std.group.env}.
59    @}*/
60    s3d_CUtilStr EnvIdent, EnvInfo;
61    SnkExtract.ExtractStr(EnvInfo, EnvIdent, "env", true);
62
63    m_ShaderEnv = s3d_CompSupplObjT<s3d_CEngShaderEnv>(
64            MsgHandler, EnvInfo, FetchSuppl,
65            EnvIdent, S3D_GENERAL_INTEROP_INTERF);
66    if(!m_ShaderEnv)
67        return;
68
69    /*@{ @declare{shadercomp.param}{eng_shader_std.directtexchan.methods}
70            {$ [str] .. [str]}
71        See @ref{prog_man.shader.methods}.
72    @}*/
73    s3d_CUtilSnkExtractUtil::ExtractAtomSortedArray(
74            m_Data->m_MethodArray, m_ShaderEnv->m_AtomMgr,
75            SnkExtract, "methods", true);
76
77
78        ///Texture properties
79        int TexWidth = 256, TexHeight = 256, TexDepth = 1, TexCompCnt = 3, TexBitPComp = 8;
80       
81        int TexProp = 0;
82    if(SnkExtract.ExtractBool("texprop_rendertarget", true))
83                TexProp |= s3d_CDrvGfxEng::TexProp_RenderTarget;
84        if(SnkExtract.ExtractBool("texprop_cube", true))
85                TexProp |= s3d_CDrvGfxEng::TexProp_Cube;
86        if(SnkExtract.ExtractBool("texprop_volume", true))
87                TexProp |= s3d_CDrvGfxEng::TexProp_Volume;
88        if(SnkExtract.ExtractBool("texprop_mipmap", true))
89                TexProp |= s3d_CDrvGfxEng::TexProp_Mipmap;
90        if(SnkExtract.ExtractBool("texprop_float", true))
91                TexProp |= s3d_CDrvGfxEng::TexProp_Float;
92        if(SnkExtract.ExtractBool("texprop_signed", true))
93                TexProp |= s3d_CDrvGfxEng::TexProp_Signed;
94        if(SnkExtract.ExtractBool("texprop_restrusage", true))
95                TexProp |= s3d_CDrvGfxEng::TexProp_RestrUsage;
96        if(SnkExtract.ExtractBool("texprop_compressed", true))
97                TexProp |= s3d_CDrvGfxEng::TexProp_Compress;
98        if(SnkExtract.ExtractBool("texprop_dynamic", true))
99                TexProp |= s3d_CDrvGfxEng::TexProp_Dynamic;
100        if(SnkExtract.ExtractBool("texprop_alpha_mask", true))
101                TexProp |= s3d_CDrvGfxEng::TexProp_AlphaIsMask;
102
103        TexCompCnt = SnkExtract.ExtractInt("texprop_comp", true, TexCompCnt);
104        TexBitPComp = SnkExtract.ExtractInt("texprop_bitspercomp", true, TexBitPComp);
105
106        switch(TexCompCnt)
107        {
108                case 1:
109                        TexProp |= s3d_CDrvGfxEng::TexProp_Comp1;
110                        break;
111                case 2:
112                        TexProp |= s3d_CDrvGfxEng::TexProp_Comp2;
113                        break;
114                case 4:
115                        TexProp |= s3d_CDrvGfxEng::TexProp_Comp4;
116                        break;
117                default:
118                        TexProp |= s3d_CDrvGfxEng::TexProp_Comp3;
119        }
120
121        switch(TexBitPComp)
122        {
123                case 16:
124                        TexProp |= s3d_CDrvGfxEng::TexProp_BitsPerComp16;
125                        break;
126                case 32:
127                        TexProp |= s3d_CDrvGfxEng::TexProp_BitsPerComp32;
128                        break;
129                default:
130                        TexProp |= s3d_CDrvGfxEng::TexProp_BitsPerComp8;
131        }
132       
133        TexWidth = SnkExtract.ExtractInt("width", true, TexWidth);
134        TexHeight = SnkExtract.ExtractInt("height", true, TexHeight);
135        TexDepth = SnkExtract.ExtractInt("depth", true, TexDepth);
136       
137       
138        m_Data->m_TexProp = TexProp;
139        m_Data->m_TexWidth = TexWidth;
140        m_Data->m_TexHeight = TexHeight;
141        m_Data->m_TexDepth = TexDepth;
142
143   
144               
145   /* s3d_CCompSetup::SetupInitObj(
146            m_ShaderEnv->m_MsgHandler, Info, Tex, FetchSuppl, TexParam);
147    m_Data->m_Tex = Tex;*/
148
149    /*@{ @declare{shadercomp.param}{eng_shader_std.directtexchan.texchan_var}
150            {$ [str]}
151       Variable where texture is being stored in for use by shader components
152       within this group.
153    @}*/
154    s3d_CUtilAtomPtr TexChanVarAtom;
155    s3d_CUtilStr TexChanInfo;
156    s3d_CUtilSnkExtractUtil::ExtractAtom(
157            m_Data->m_TexChanVarInfo, m_Data->m_TexChanVarAtom,
158            m_ShaderEnv->m_AtomMgr, SnkExtract, "texchan_var", true);
159
160    m_Data->m_SampMode = 0;
161
162    /*@{ @declare{shadercomp.param}
163            {eng_shader_std.directtexchan.samplermode_clamp}
164            {$ [bool]}
165    @}*/
166    if(SnkExtract.ExtractBool("samplermode_clamp", true))
167    {
168        m_Data->m_SampMode |= s3d_CDrvGfxEng::SampMode_ClampX;
169        m_Data->m_SampMode |= s3d_CDrvGfxEng::SampMode_ClampY;
170    }
171
172    /*@{ @declare{shadercomp.param}
173            {eng_shader_std.directtexchan.samplermode_filter}
174            {$ [bool]}
175    @}*/
176    if(SnkExtract.ExtractBool("samplermode_filter", true))
177        m_Data->m_SampMode |= s3d_CDrvGfxEng::SampMode_Filter;
178
179    SnkExtract.CheckForUnknown();
180}
181
182void gtp_ShaderCreateTex::SetupDone()
183{
184}
185
186s3d_CUtilStr gtp_ShaderCreateTex::GetInfo()
187{
188    return m_Data->m_Info;
189}
190
191void gtp_ShaderCreateTex::RegisterNotif(
192        s3d_CUtilNotifRecip *Recip)
193{
194}
195
196s3d_CEngShaderGfxPtr gtp_ShaderCreateTex::FindShaderGfx(
197        s3d_CUtilNotifGather *NotifGather, s3d_CEngGfxCtx *GfxCtx)
198{
199    if(!m_ShaderEnv)
200        return 0;
201
202    gtp_ShaderCreateTexGfxPtr ShaderGfx;
203    gtp_ShaderCreateTexGfxTree::CNode *Pos
204            = s3d_UtilTreeSortedGetStart(m_ShaderGfxTree, GfxCtx);
205    if(s3d_UtilTreeIsEqualAt(Pos, GfxCtx))
206        ShaderGfx = Pos->m_Data.m_Val;
207    else
208    {
209        ShaderGfx = S3D_SYS_NEW gtp_ShaderCreateTexGfx(
210                m_ShaderEnv, GfxCtx, m_Data);
211        gtp_ShaderCreateTexGfxTree::CNode *Node
212                = ShaderGfx->GetNode();
213        m_ShaderGfxTree.InsertBefore(Pos, Node);
214    }
215    return ShaderGfx.Get();
216}
217
218///////////////////////////////////////////////////////////////////////////////
219
220gtp_ShaderCreateTexGfx::gtp_ShaderCreateTexGfx(
221        s3d_CEngShaderEnv *ShaderEnv,
222        s3d_CEngGfxCtx *GfxCtx,
223        gtp_ShaderCreateTexData *Data)
224{
225    m_Node.m_Data.m_Key = GfxCtx;
226    m_Node.m_Data.m_Val = this;
227    m_ShaderEnv = ShaderEnv;
228    m_Data = Data;
229
230       
231}
232
233gtp_ShaderCreateTexGfxTree::CNode
234        *gtp_ShaderCreateTexGfx::GetNode()
235{
236    return &m_Node;
237}
238
239void gtp_ShaderCreateTexGfx::RegisterNotif(
240        s3d_CUtilNotifRecip *Recip)
241{
242}
243
244void gtp_ShaderCreateTexGfx::ExtractGfx()
245{
246    m_Node.Extract();
247}
248
249bool gtp_ShaderCreateTexGfx::IsValid()
250{
251    return true;
252}
253
254void gtp_ShaderCreateTexGfx::LinkCollect(
255        s3d_CUtilAtomSet &VarAtomSet)
256{
257    s3d_CDrvUtilVarUtil::LinkCollect(
258            VarAtomSet, m_Data->m_TexChanVarAtom);
259}
260
261void gtp_ShaderCreateTexGfx::LinkAppoint(
262        s3d_CDrvVarDecl *VarDecl)
263{
264    s3d_CDrvUtilVarUtil::LinkAppoint(
265            m_TexChanVarSlot.m_Val,
266            VarDecl, m_Data->m_TexChanVarAtom);   
267}
268
269s3d_CEngShaderInstPtr gtp_ShaderCreateTexGfx::CreateShaderInst(
270        s3d_CEngShaderHead *Head)
271{
272    return S3D_SYS_NEW gtp_ShaderCreateTexInst(
273            m_ShaderEnv, this);
274}
275
276///////////////////////////////////////////////////////////////////////////////
277
278gtp_ShaderCreateTexInst::gtp_ShaderCreateTexInst(
279        s3d_CEngShaderEnv *ShaderEnv,
280        gtp_ShaderCreateTexGfx *ShaderGfx)
281{
282    m_ShaderEnv = ShaderEnv;
283    m_ShaderGfx = ShaderGfx;
284
285         s3d_CDrvGfxTexPtr Tex =
286                 m_ShaderGfx->m_Node.m_Data.m_Key->m_GfxEng->
287                                   CreateTexDirect( m_ShaderGfx->m_Data->m_Info,
288                                                                        m_ShaderGfx->m_Data->m_TexProp,
289                                                                        m_ShaderGfx->m_Data->m_TexWidth,
290                                                                        m_ShaderGfx->m_Data->m_TexHeight,
291                                                                        m_ShaderGfx->m_Data->m_TexDepth);
292
293         m_TexGfx = m_ShaderGfx->m_Data->m_Tex = Tex;
294}
295
296void gtp_ShaderCreateTexInst::RegisterNotif(
297        s3d_CUtilNotifRecip *Recip)
298{
299}
300
301void gtp_ShaderCreateTexInst::SetShaderCtx(
302        s3d_CEngShaderCtx *ShaderCtx)
303{
304}
305
306void gtp_ShaderCreateTexInst::SetGfxState(
307        s3d_CEngGfxState *GfxState)
308{
309}
310
311void gtp_ShaderCreateTexInst::SetPos(s3d_CEngPos *Pos)
312{
313}
314
315void gtp_ShaderCreateTexInst::SetModel(s3d_CEngModel *Model)
316{
317}
318
319void gtp_ShaderCreateTexInst::ArrangeCollect(
320        s3d_CUtilMemPool *MemPool,
321        s3d_CEngShaderScopeArray &ScopeArray)
322{
323}
324
325void gtp_ShaderCreateTexInst::ArrangeInit(
326        s3d_CUtilMemPool *MemPool,
327        s3d_CEngShaderScopeArray_cr ScopeArray)
328{
329    s3d_CSysIntps nScope = ScopeArray.GetCnt();
330    s3d_CSysIntps iScope;
331    for(iScope = 0; iScope < nScope; iScope++)
332    {
333        s3d_CEngShaderScope *Scope = ScopeArray.GetAt(iScope);
334        SetVars(MemPool, Scope);
335    }
336}
337
338void gtp_ShaderCreateTexInst::ArrangePerform(
339        s3d_CUtilMemPool *MemPool,
340        s3d_CEngShaderScopeArray_cr ScopeArray)
341{
342}
343
344void gtp_ShaderCreateTexInst::ArrangeFeedback(
345        s3d_CUtilMemPool *MemPool,
346        s3d_CEngShaderScopeArray_cr ScopeArray)
347{
348}
349
350void gtp_ShaderCreateTexInst::ArrangeGather(
351        s3d_CEngShaderExecArray &ExecArray)
352{
353    gtp_ShaderCreateTexData *Data = m_ShaderGfx->m_Data;
354
355    s3d_CEngUtilShaderUtil::ArrangeGather(
356            ExecArray, Data->m_MethodArray, this);
357}
358
359void gtp_ShaderCreateTexInst::ShaderExecPerform(
360        s3d_CEngShaderScope *Scope,
361        s3d_CUtilAtom *Method,
362        s3d_CEngGfxTaskArray &TaskArray)
363{
364    SetVars(m_ShaderEnv->m_MemPool, Scope);
365}
366
367void gtp_ShaderCreateTexInst::SetVars(
368        s3d_CUtilMemPool *MemPool, s3d_CEngShaderScope *Scope)
369{
370    gtp_ShaderCreateTexGfx *ShaderGfx = m_ShaderGfx;
371    gtp_ShaderCreateTexData *Data = ShaderGfx->m_Data;
372
373    s3d_CDrvVarSlot TexChanVarSlot = ShaderGfx->m_TexChanVarSlot;
374    if(TexChanVarSlot >= 0)
375    {
376        s3d_CEngGfxVarTexChan *TexChanVar =
377                new(MemPool) s3d_CEngGfxVarTexChan;
378
379        s3d_CEngTexChan *TexChan = &TexChanVar->m_Val;
380        TexChan->m_FixedDrvTex = 0;
381        s3d_CDrvGfxTexPtr TexGfx = m_TexGfx;
382        if(TexGfx)
383            TexChan->m_FixedDrvTex = TexGfx;
384        TexChan->m_FixedSampMode = Data->m_SampMode;
385
386        s3d_DrvVarSet(Scope->m_VarBlk, TexChanVarSlot, TexChanVar);
387    }
388}
389
390///////////////////////////////////////////////////////////////////////////////
Note: See TracBrowser for help on using the repository browser.