[2269] | 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 |
|
---|
| 29 | This component writes a reference to a texture
|
---|
| 30 | into a texture channel variable.
|
---|
| 31 | See also @ref{prog_man.shader.texture_channels}.
|
---|
| 32 | @p
|
---|
| 33 |
|
---|
| 34 | @}*/
|
---|
| 35 | ///////////////////////////////////////////////////////////////////////////////
|
---|
| 36 |
|
---|
| 37 | S3D_UTIL_RTTI_TABLE_DEFINE_BEGIN(gtp_ShaderCreateTex)
|
---|
| 38 | S3D_UTIL_RTTI_TABLE_DEFINE_BASE(s3d_CEngShader)
|
---|
| 39 | S3D_UTIL_RTTI_TABLE_DEFINE_BASE(s3d_CCompUtilUniqueBase)
|
---|
| 40 | S3D_UTIL_RTTI_TABLE_DEFINE_BASE(s3d_CCompSetup)
|
---|
| 41 | S3D_UTIL_RTTI_TABLE_DEFINE_END
|
---|
| 42 |
|
---|
| 43 | gtp_ShaderCreateTex::gtp_ShaderCreateTex()
|
---|
| 44 | {
|
---|
| 45 | }
|
---|
| 46 |
|
---|
| 47 | void 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 |
|
---|
| 182 | void gtp_ShaderCreateTex::SetupDone()
|
---|
| 183 | {
|
---|
| 184 | }
|
---|
| 185 |
|
---|
| 186 | s3d_CUtilStr gtp_ShaderCreateTex::GetInfo()
|
---|
| 187 | {
|
---|
| 188 | return m_Data->m_Info;
|
---|
| 189 | }
|
---|
| 190 |
|
---|
| 191 | void gtp_ShaderCreateTex::RegisterNotif(
|
---|
| 192 | s3d_CUtilNotifRecip *Recip)
|
---|
| 193 | {
|
---|
| 194 | }
|
---|
| 195 |
|
---|
| 196 | s3d_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 |
|
---|
| 220 | gtp_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 |
|
---|
| 233 | gtp_ShaderCreateTexGfxTree::CNode
|
---|
| 234 | *gtp_ShaderCreateTexGfx::GetNode()
|
---|
| 235 | {
|
---|
| 236 | return &m_Node;
|
---|
| 237 | }
|
---|
| 238 |
|
---|
| 239 | void gtp_ShaderCreateTexGfx::RegisterNotif(
|
---|
| 240 | s3d_CUtilNotifRecip *Recip)
|
---|
| 241 | {
|
---|
| 242 | }
|
---|
| 243 |
|
---|
| 244 | void gtp_ShaderCreateTexGfx::ExtractGfx()
|
---|
| 245 | {
|
---|
| 246 | m_Node.Extract();
|
---|
| 247 | }
|
---|
| 248 |
|
---|
| 249 | bool gtp_ShaderCreateTexGfx::IsValid()
|
---|
| 250 | {
|
---|
| 251 | return true;
|
---|
| 252 | }
|
---|
| 253 |
|
---|
| 254 | void gtp_ShaderCreateTexGfx::LinkCollect(
|
---|
| 255 | s3d_CUtilAtomSet &VarAtomSet)
|
---|
| 256 | {
|
---|
| 257 | s3d_CDrvUtilVarUtil::LinkCollect(
|
---|
| 258 | VarAtomSet, m_Data->m_TexChanVarAtom);
|
---|
| 259 | }
|
---|
| 260 |
|
---|
| 261 | void 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 |
|
---|
| 269 | s3d_CEngShaderInstPtr gtp_ShaderCreateTexGfx::CreateShaderInst(
|
---|
| 270 | s3d_CEngShaderHead *Head)
|
---|
| 271 | {
|
---|
| 272 | return S3D_SYS_NEW gtp_ShaderCreateTexInst(
|
---|
| 273 | m_ShaderEnv, this);
|
---|
| 274 | }
|
---|
| 275 |
|
---|
| 276 | ///////////////////////////////////////////////////////////////////////////////
|
---|
| 277 |
|
---|
| 278 | gtp_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 |
|
---|
| 296 | void gtp_ShaderCreateTexInst::RegisterNotif(
|
---|
| 297 | s3d_CUtilNotifRecip *Recip)
|
---|
| 298 | {
|
---|
| 299 | }
|
---|
| 300 |
|
---|
| 301 | void gtp_ShaderCreateTexInst::SetShaderCtx(
|
---|
| 302 | s3d_CEngShaderCtx *ShaderCtx)
|
---|
| 303 | {
|
---|
| 304 | }
|
---|
| 305 |
|
---|
| 306 | void gtp_ShaderCreateTexInst::SetGfxState(
|
---|
| 307 | s3d_CEngGfxState *GfxState)
|
---|
| 308 | {
|
---|
| 309 | }
|
---|
| 310 |
|
---|
| 311 | void gtp_ShaderCreateTexInst::SetPos(s3d_CEngPos *Pos)
|
---|
| 312 | {
|
---|
| 313 | }
|
---|
| 314 |
|
---|
| 315 | void gtp_ShaderCreateTexInst::SetModel(s3d_CEngModel *Model)
|
---|
| 316 | {
|
---|
| 317 | }
|
---|
| 318 |
|
---|
| 319 | void gtp_ShaderCreateTexInst::ArrangeCollect(
|
---|
| 320 | s3d_CUtilMemPool *MemPool,
|
---|
| 321 | s3d_CEngShaderScopeArray &ScopeArray)
|
---|
| 322 | {
|
---|
| 323 | }
|
---|
| 324 |
|
---|
| 325 | void 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 |
|
---|
| 338 | void gtp_ShaderCreateTexInst::ArrangePerform(
|
---|
| 339 | s3d_CUtilMemPool *MemPool,
|
---|
| 340 | s3d_CEngShaderScopeArray_cr ScopeArray)
|
---|
| 341 | {
|
---|
| 342 | }
|
---|
| 343 |
|
---|
| 344 | void gtp_ShaderCreateTexInst::ArrangeFeedback(
|
---|
| 345 | s3d_CUtilMemPool *MemPool,
|
---|
| 346 | s3d_CEngShaderScopeArray_cr ScopeArray)
|
---|
| 347 | {
|
---|
| 348 | }
|
---|
| 349 |
|
---|
| 350 | void 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 |
|
---|
| 359 | void 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 |
|
---|
| 367 | void 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 | ///////////////////////////////////////////////////////////////////////////////
|
---|