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

Revision 2196, 12.5 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_focusedprojmat.h"
17#include "../../util/eng_util_gfxutil.h"
18#include "../../util/eng_util_shaderutil.h"
19#include "../../util/eng_util_mathutil.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#include "../../../util/math/util_geo_types.h"
24
25///////////////////////////////////////////////////////////////////////////////
26/*@{
27
28@declare{shadercomp.class}{eng_shader_special.worldmat}{}
29
30Provides a matrix which maps from view coordinates
31in world coordinates.
32@p
33
34Important warning!
35Usually, if you need this matrix something is wrong!
36See @ref{prog_man.shader.coord_systems}.
37@p
38
39@}*/
40///////////////////////////////////////////////////////////////////////////////
41
42S3D_UTIL_RTTI_TABLE_DEFINE_BEGIN(gtp_Shader_FocusedProjMat)
43S3D_UTIL_RTTI_TABLE_DEFINE_BASE(s3d_CEngShader)
44S3D_UTIL_RTTI_TABLE_DEFINE_BASE(s3d_CCompUtilUniqueBase)
45S3D_UTIL_RTTI_TABLE_DEFINE_BASE(s3d_CCompSetup)
46S3D_UTIL_RTTI_TABLE_DEFINE_END
47
48gtp_Shader_FocusedProjMat::gtp_Shader_FocusedProjMat()
49{
50}
51
52void gtp_Shader_FocusedProjMat::SetupInit(
53        s3d_CUtilMsgHandler *MsgHandler, s3d_CUtilStr_cr Info,
54        s3d_CCompSuppl *FetchSuppl, s3d_CUtilSnkChunk *Param)
55{
56    m_Data = S3D_SYS_NEW gtp_Shader_FocusedProjMatData;
57
58    s3d_CUtilSnkExtract SnkExtract;
59    SnkExtract.Assign(MsgHandler, Param);
60    m_Data->m_Info = SnkExtract.GetInfo();
61
62    /*@{ @declare{shadercomp.param}{eng_shader_special.worldmat.env}{$ [str]}
63        See @ident{comp}{eng_shader_std.group.env}.
64    @}*/
65    s3d_CUtilStr EnvIdent, EnvInfo;
66    SnkExtract.ExtractStr(EnvInfo, EnvIdent, "env", true);
67
68    m_ShaderEnv = s3d_CompSupplObjT<s3d_CEngShaderEnv>(
69            MsgHandler, EnvInfo, FetchSuppl,
70            EnvIdent, S3D_GENERAL_INTEROP_INTERF);
71    if(!m_ShaderEnv)
72        return;
73
74    /*@{ @declare{shadercomp.param}{eng_shader_special.worldmat.methods}
75            {$ [str] .. [str]}
76        See @ref{prog_man.shader.methods}.
77    @}*/
78    s3d_CUtilSnkExtractUtil::ExtractAtomSortedArray(
79            m_Data->m_MethodArray, m_ShaderEnv->m_AtomMgr,
80            SnkExtract, "methods", true);
81
82    /*@{ @declare{shadercomp.param}
83            {eng_shader_special.worldmat.worldmat_var}{$ [str]}
84        The variable stores the resulting matrix.
85        The variable is of type mat4x4f.
86    @}*/
87    s3d_CUtilSnkExtractUtil::ExtractAtom(
88            m_Data->m_FocusedProjMatVarInfo, m_Data->m_FocusedProjMatVarAtom,
89            m_ShaderEnv->m_AtomMgr, SnkExtract, "destmat_var", true);   
90
91        /*@{ @declare{shader.param}{eng_shader_special.envmap.mesh_var}{$ [str]}
92    @}*/
93    s3d_CUtilSnkExtractUtil::ExtractAtom(
94            m_Data->m_MeshVarInfo, m_Data->m_MeshVarAtom,
95            m_ShaderEnv->m_AtomMgr, SnkExtract, "mesh_var", true);
96
97        s3d_CUtilSnkExtractUtil::ExtractAtom(
98            m_Data->m_CenterPointVarInfo, m_Data->m_CenterPointVarAtom,
99            m_ShaderEnv->m_AtomMgr, SnkExtract, "centerpoint_var", true);
100
101    SnkExtract.CheckForUnknown();
102}
103
104void gtp_Shader_FocusedProjMat::SetupDone()
105{
106}
107
108s3d_CUtilStr gtp_Shader_FocusedProjMat::GetInfo()
109{
110    return m_Data->m_Info;
111}
112
113void gtp_Shader_FocusedProjMat::RegisterNotif(s3d_CUtilNotifRecip *Recip)
114{
115}
116
117s3d_CEngShaderGfxPtr gtp_Shader_FocusedProjMat::FindShaderGfx(
118        s3d_CUtilNotifGather *NotifGather, s3d_CEngGfxCtx *GfxCtx)
119{
120    if(!m_ShaderEnv)
121        return 0;
122
123    gtp_Shader_FocusedProjMatGfxPtr ShaderGfx;
124
125    gtp_Shader_FocusedProjMatGfxTree::CNode *Pos
126            = s3d_UtilTreeSortedGetStart(m_ShaderGfxTree, GfxCtx);
127    if(s3d_UtilTreeIsEqualAt(Pos, GfxCtx))
128        ShaderGfx = Pos->m_Data.m_Val;
129    else
130    {
131        ShaderGfx = S3D_SYS_NEW gtp_Shader_FocusedProjMatGfx(
132                m_ShaderEnv, GfxCtx, m_Data);
133        gtp_Shader_FocusedProjMatGfxTree::CNode *Node
134                = ShaderGfx->GetNode();
135        m_ShaderGfxTree.InsertBefore(Pos, Node);
136    }
137    return ShaderGfx.Get();
138}
139
140///////////////////////////////////////////////////////////////////////////////
141
142gtp_Shader_FocusedProjMatGfx::gtp_Shader_FocusedProjMatGfx(
143        s3d_CEngShaderEnv *ShaderEnv, s3d_CEngGfxCtx *GfxCtx,
144        gtp_Shader_FocusedProjMatData *Data)
145{
146    m_Node.m_Data.m_Key = GfxCtx;
147    m_Node.m_Data.m_Val = this;
148    m_ShaderEnv = ShaderEnv;
149    m_Data = Data;
150}
151
152gtp_Shader_FocusedProjMatGfxTree::CNode *
153        gtp_Shader_FocusedProjMatGfx::GetNode()
154{
155    return &m_Node;
156}
157
158void gtp_Shader_FocusedProjMatGfx::RegisterNotif(
159        s3d_CUtilNotifRecip *Recip)
160{
161}
162
163void gtp_Shader_FocusedProjMatGfx::ExtractGfx()
164{
165    m_Node.Extract();
166}
167
168bool gtp_Shader_FocusedProjMatGfx::IsValid()
169{
170    return true;
171}
172
173void gtp_Shader_FocusedProjMatGfx::LinkCollect(
174        s3d_CUtilAtomSet &VarAtomSet)
175{
176    s3d_CDrvUtilVarUtil::LinkCollect(
177            VarAtomSet, m_Data->m_FocusedProjMatVarAtom);
178        s3d_CDrvUtilVarUtil::LinkCollect(
179            VarAtomSet, m_Data->m_CenterPointVarAtom);
180        s3d_CDrvUtilVarUtil::LinkCollect(
181            VarAtomSet, m_Data->m_MeshVarAtom);   
182}
183
184void gtp_Shader_FocusedProjMatGfx::LinkAppoint(
185        s3d_CDrvVarDecl *VarDecl)
186{
187    s3d_CDrvUtilVarUtil::LinkAppoint(
188            m_FocusedProjMatVarSlot.m_Val,
189            VarDecl, m_Data->m_FocusedProjMatVarAtom);
190        s3d_CDrvUtilVarUtil::LinkAppoint(
191            m_CenterPointVarSlot.m_Val,
192            VarDecl, m_Data->m_CenterPointVarAtom);
193        s3d_CDrvUtilVarUtil::LinkAppoint(
194            m_MeshVarSlot.m_Val,
195            VarDecl, m_Data->m_MeshVarAtom);
196}
197
198s3d_CEngShaderInstPtr gtp_Shader_FocusedProjMatGfx::CreateShaderInst(
199        s3d_CEngShaderHead *Head)
200{
201    return S3D_SYS_NEW gtp_Shader_FocusedProjMatInst(
202            m_ShaderEnv, this);
203}
204
205///////////////////////////////////////////////////////////////////////////////
206
207gtp_Shader_FocusedProjMatInst::gtp_Shader_FocusedProjMatInst(
208        s3d_CEngShaderEnv *ShaderEnv,
209        gtp_Shader_FocusedProjMatGfx *ShaderGfx)
210{
211    m_ShaderEnv = ShaderEnv;
212    m_ShaderGfx = ShaderGfx;
213}
214
215void gtp_Shader_FocusedProjMatInst::RegisterNotif(
216        s3d_CUtilNotifRecip *Recip)
217{
218}
219
220void gtp_Shader_FocusedProjMatInst::SetShaderCtx(
221        s3d_CEngShaderCtx *ShaderCtx)
222{
223}
224
225void gtp_Shader_FocusedProjMatInst::SetGfxState(s3d_CEngGfxState *GfxState)
226{
227}
228
229void gtp_Shader_FocusedProjMatInst::SetPos(s3d_CEngPos *Pos)
230{
231    m_Pos = Pos;
232}
233
234void gtp_Shader_FocusedProjMatInst::SetModel(s3d_CEngModel *Model)
235{
236}
237
238void gtp_Shader_FocusedProjMatInst::ArrangeCollect(
239        s3d_CUtilMemPool *MemPool,
240        s3d_CEngShaderScopeArray &ScopeArray)
241{
242}
243
244void gtp_Shader_FocusedProjMatInst::ArrangeInit(
245        s3d_CUtilMemPool *MemPool,
246        s3d_CEngShaderScopeArray_cr ScopeArray)
247{
248    s3d_CSysIntps nScope = ScopeArray.GetCnt();
249    s3d_CSysIntps iScope;
250    for(iScope = 0; iScope < nScope; iScope++)
251    {
252        s3d_CEngShaderScope *Scope = ScopeArray.GetAt(iScope);
253        SetVars(MemPool, Scope);
254    }
255}
256
257void gtp_Shader_FocusedProjMatInst::ArrangePerform(
258        s3d_CUtilMemPool *MemPool,
259        s3d_CEngShaderScopeArray_cr ScopeArray)
260{
261}
262
263void gtp_Shader_FocusedProjMatInst::ArrangeFeedback(
264        s3d_CUtilMemPool *MemPool,
265        s3d_CEngShaderScopeArray_cr ScopeArray)
266{
267}
268
269void gtp_Shader_FocusedProjMatInst::ArrangeGather(
270        s3d_CEngShaderExecArray &ExecArray)
271{
272    gtp_Shader_FocusedProjMatData *Data = m_ShaderGfx->m_Data;
273
274    s3d_CEngUtilShaderUtil::ArrangeGather(
275            ExecArray, Data->m_MethodArray, this);
276}
277
278void gtp_Shader_FocusedProjMatInst::ShaderExecPerform(
279        s3d_CEngShaderScope *Scope,
280        s3d_CUtilAtom *Method,
281        s3d_CEngGfxTaskArray &TaskArray)
282{
283        gtp_Shader_FocusedProjMatGfx *ShaderGfx = m_ShaderGfx;
284    gtp_Shader_FocusedProjMatData *Data = ShaderGfx->m_Data;
285       
286       
287
288    SetVars(m_ShaderEnv->m_MemPool, Scope);
289}
290
291void gtp_Shader_FocusedProjMatInst::SetVars(
292        s3d_CUtilMemPool *MemPool, s3d_CEngShaderScope *Scope)
293{
294    gtp_Shader_FocusedProjMatGfx *ShaderGfx = m_ShaderGfx;
295    gtp_Shader_FocusedProjMatData *Data = ShaderGfx->m_Data;
296
297
298
299
300    s3d_CDrvVarSlot ProjMatVarSlot = ShaderGfx->m_FocusedProjMatVarSlot;
301    if(ProjMatVarSlot >= 0)
302    {
303        s3d_CEngGfxPortion *Portion = Scope->m_Portion;
304                if(Portion)
305                {
306                        s3d_CEngGfxCam *Cam = &Portion->m_Cam;
307                        s3d_CEngGfxVarMesh *MeshVar = s3d_EngGfxVarFetchWaryMesh(
308            m_ShaderEnv->m_MsgHandler, Scope->m_Info,
309            Scope->m_VarBlk, m_ShaderGfx->m_MeshVarSlot.m_Val);
310                        if(!MeshVar)
311                                return;
312
313                        s3d_CDrvVarVec4f *CenterPointVar
314                                = s3d_DrvVarFetchWaryVec4f(
315                                        m_ShaderEnv->m_MsgHandler, Data->m_CenterPointVarInfo.GetChars(),
316                                        Scope->m_VarBlk, ShaderGfx->m_CenterPointVarSlot.m_Val);
317                        if(!CenterPointVar)
318                                return;
319
320            s3d_CUtilTranslQuatf viewToWorld = Cam->m_Transf;
321                        s3d_CUtilTranslQuatf modelToView = MeshVar->m_Val.m_ViewTransf;
322                       
323                        s3d_CUtilVec3f BoundCen = MeshVar->m_Val.m_MeshCompos.m_BoundCen;
324                        s3d_CUtilVec3f BoundCenView = modelToView.ApplyToPoint(BoundCen);
325                       
326                        s3d_CUtilVec3f BoundExt = MeshVar->m_Val.m_MeshCompos.m_BoundExt;                       
327                        s3d_CUtilVec3f CenterPositionView = s3d_CUtilVec3f(CenterPointVar->m_Val.m_x,
328                                                                                                                       CenterPointVar->m_Val.m_y,
329                                                                                                                       CenterPointVar->m_Val.m_z);
330                       
331                    s3d_CUtilVec3f DirView = (BoundCenView - CenterPositionView);
332                        float d = DirView.GetLen();
333                        float r = BoundExt.GetLen();
334                        DirView = DirView.GetNormalized();
335                       
336                        if(d < 1.5 * r)
337                        {
338                                d = 1.5 * r;                                                           
339                                CenterPositionView = BoundCenView - DirView * d;                               
340                        }                       
341                        float NearPlane = d - r;
342                        float FarPlane = d + r;
343                       
344                        float cotanFov = 1.0 / s3d_SysTan(s3d_SysAsin(r / d));
345                        float Q = FarPlane / (FarPlane - NearPlane);
346                        s3d_CUtilMat4x4f lightProjMat(cotanFov,        0, 0,            0,
347                                                                 0, cotanFov, 0,            0,
348                                                                                     0,        0, Q, -Q*NearPlane,
349                                                                                     0,        0, 1,            0);
350                        //float tanFov = s3d_SysTan(s3d_SysAsin(r / d));
351                        //s3d_CUtilMat4x4f lightProjMat = s3d_CEngUtilMathUtil::CalcProjPersp( tanFov, tanFov, 0, 0, NearPlane, FarPlane);
352           
353                        /*CenterPositionView = BoundCenView - DirView * r;
354                        s3d_CUtilMat4x4f lightProjMat(1.0 / r,       0,       0, 0,
355                                                                0, 1.0 / r,       0, 0,
356                                                                                    0,       0, 0.5 / r, 0,
357                                                                                    0,       0,       0, 1);*/
358
359                        s3d_CUtilMat4x4f worldToViewMatIT = s3d_CUtilGeof::GetMapOfTransf3(viewToWorld);
360            worldToViewMatIT = worldToViewMatIT.GetTransp();
361
362                        s3d_CUtilVec4f upView4 = worldToViewMatIT * s3d_CUtilVec4f(0,0,-1,1);
363                        s3d_CUtilVec3f upView(upView4.m_x, upView4.m_y, upView4.m_z);
364            upView = upView.GetNormalized();
365                        s3d_CUtilVec3f rightView = upView^DirView;
366                        rightView = rightView.GetNormalized();
367                        upView = DirView^rightView;
368                        upView = upView.GetNormalized();
369                       
370                        s3d_CUtilMat4x4f viewToLightViewMatRot(rightView.m_x, rightView.m_y, rightView.m_z, 0,
371                                                                   upView.m_x,    upView.m_y,    upView.m_z,    0,
372                                                                                       DirView.m_x,   DirView.m_y,   DirView.m_z,   0,
373                                                                                       0,             0,             0,             1);
374                        s3d_CUtilMat4x4f viewToLightViewMatTransl(1, 0, 0, -CenterPositionView.m_x,
375                                                                       0, 1, 0, -CenterPositionView.m_y,
376                                                                                           0, 0, 1, -CenterPositionView.m_z,
377                                                                                           0, 0, 0,  1);
378                       
379                        s3d_CUtilMat4x4f viewToLightViewMat = viewToLightViewMatRot * viewToLightViewMatTransl;
380                       
381                        s3d_CUtilMat4x4f FinalMat = lightProjMat * viewToLightViewMat; 
382
383                        s3d_CUtilVec4f temp  = FinalMat * s3d_CUtilVec4f(1,0,0,1);
384                       
385                        s3d_CDrvVarMat4x4f *FinalMatVar = new(MemPool) s3d_CDrvVarMat4x4f;
386                        FinalMatVar->m_Val = FinalMat;
387                        s3d_DrvVarSet(Scope->m_VarBlk, ProjMatVarSlot, FinalMatVar);
388                }
389    }
390}
391
392///////////////////////////////////////////////////////////////////////////////
393
Note: See TracBrowser for help on using the repository browser.