TexData Struct Reference

#include <c4d_shader.h>

Detailed Description

Texture information.

Note
Has to be created with Alloc() and destroyed with Free(). Use AutoAlloc to automate the allocation and destruction based on scope.

The ox, oy and m values may differ from the values specified in the dialog, these are a precalculated raytracer representation. To better understand the meaning of those values please print this routine (it is the projection routine in source code):

Bool ShdProjectPoint(VolumeData *sd, TexData *tdp, Int32 lhit, const Vector &p, const Vector &n, Vector *uv)
{
Float lenxinv=0.0,lenyinv=0.0;
if (tdp->lenx!=0.0) lenxinv = 1.0/tdp->lenx;
if (tdp->leny!=0.0) lenyinv = 1.0/tdp->leny;
switch (tdp->proj)
{
{
*uv = p * tdp->im;
return true;
}
case P_SPHERICAL: default:
{
Vector d = p * tdp->im;
Float sq = Sqrt(d.x*d.x + d.z*d.z);
if (sq==0.0)
{
uv->x = 0.0;
if (d.y>0.0)
uv->y = +0.5;
else
uv->y = -0.5;
}
else
{
uv->x = ACos(d.x/sq)/PI2;
if (d.z<0.0) uv->x = 1.0-uv->x;
uv->x -= tdp->ox;
if (tdp->lenx>0.0 && uv->x<0.0)
uv->x += 1.0;
else if (tdp->lenx<0.0 && uv->x>0.0)
uv->x -= 1.0;
uv->x *= lenxinv;
uv->y = ATan(d.y/sq)/PI;
}
uv->y = -(uv->y+tdp->oy)*lenyinv;
break;
}
{
Vector d = p * tdp->im;
Float sn,cs,sq = Sqrt(d.x*d.x + d.z*d.z);
if (sq==0.0)
{
uv->x = 0.0;
if (d.y>0.0)
uv->y = 0.0;
else
uv->y = 1.0;
}
else
{
uv->x = ACos(d.x/sq)/PI2;
if (d.z<0.0) uv->x = 1.0-uv->x;
uv->y = 0.5-ATan(d.y/sq)/PI;
}
SinCos(uv->x*PI2,sn,cs);
uv->x = (0.5 + 0.5*cs*uv->y - tdp->ox)*lenxinv;
uv->y = (0.5 + 0.5*sn*uv->y - tdp->oy)*lenyinv;
break;
}
{
Vector d = p * tdp->im;
Float sq = Sqrt(d.x*d.x + d.z*d.z);
if (sq==0.0)
uv->x = 0.0;
else
{
uv->x = ACos(d.x/sq)/PI2;
if (d.z<0.0) uv->x = 1.0-uv->x;
uv->x -= tdp->ox;
if (tdp->lenx>0.0 && uv->x<0.0)
uv->x += 1.0;
else if (tdp->lenx<0.0 && uv->x>0.0)
uv->x -= 1.0;
uv->x *= lenxinv;
}
uv->y = -(d.y*0.5+tdp->oy)*lenyinv;
break;
}
case P_FLAT: case P_SPATIAL:
{
Vector d = p * tdp->im;
uv->x = (d.x*0.5-tdp->ox)*lenxinv;
uv->y = -(d.y*0.5+tdp->oy)*lenyinv;
break;
}
case P_CUBIC:
{
Vector d = p * tdp->im;
Vector v = n ^ tdp->im;
Int32 dir;
if (Abs(v.x)>Abs(v.y))
{
if (Abs(v.x)>Abs(v.z))
dir = 0;
else
dir = 2;
}
else
{
if (Abs(v.y)>Abs(v.z))
dir = 1;
else
dir = 2;
}
switch (dir)
{
case 0: // x axis
{
if (v.x<0.0)
uv->x = (-d.z*0.5-tdp->ox)*lenxinv;
else
uv->x = ( d.z*0.5-tdp->ox)*lenxinv;
uv->y = -(d.y*0.5+tdp->oy)*lenyinv;
break;
}
case 1: // y axis
{
if (v.y<0.0)
uv->y = ( d.z*0.5-tdp->oy)*lenyinv;
else
uv->y = (-d.z*0.5-tdp->oy)*lenyinv;
uv->x = (d.x*0.5-tdp->ox)*lenxinv;
break;
}
case 2: // z axis
{
if (v.z<0.0)
uv->x = ( d.x*0.5-tdp->ox)*lenxinv;
else
uv->x = (-d.x*0.5-tdp->ox)*lenxinv;
uv->y = -(d.y*0.5+tdp->oy)*lenyinv;
break;
}
}
break;
}
case P_FRONTAL:
{
Float ox=0.0,oy=0.0,ax=param->xres,ay=param->yres;
Int32 curr_x,curr_y,scl;
sd->GetXY(&curr_x,&curr_y,&scl);
uv->x = ((Float(curr_x)/Float(scl)-ox)/ax - tdp->ox)*lenxinv;
uv->y = ((Float(curr_y)/Float(scl)-ox)/ay - tdp->oy)*lenyinv;
break;
}
case P_UVW:
{
RayObject *op=sd->ID_to_Obj(lhit,nullptr);
if (op && tdp->uvwind<op->uvwcnt && op->uvwadr[tdp->uvwind])
*uv=sd->GetPointUVW(tdp,lhit,p);
else
uv->x = uv->y = 0.0;
break;
}
}
if (tdp->texflag&TEX_TILE)
return true;
else
return uv->x>=0.0 && uv->x<=1.0 && uv->y>=0.0 && uv->y<=1.0;
}

Public Member Functions

void Init (void)
 

Static Public Member Functions

static TexDataAlloc ()
 
static void Free (TexData *&td)
 

Public Attributes

Matrix m
 
Matrix im
 
Char texflag
 
Char additive
 
Char proj
 
Char side
 
Int32 restrict
 
Float ox
 
Float oy
 
Float lenx
 
Float leny
 
Float repetitionx
 
Float repetitiony
 
GeListNodemp
 
Int32 uvwind
 
BaseViewcamera
 
Char uvbump
 
BaseTaglink
 
Float invLenx
 
Float invLeny
 
Bool parallaxUVW
 

Private Member Functions

 TexData ()
 
 ~TexData ()
 

Constructor & Destructor Documentation

◆ TexData()

TexData ( )
private

◆ ~TexData()

~TexData ( )
private

Member Function Documentation

◆ Alloc()

static TexData* Alloc ( )
static

Allocates a texture data. Destroy the allocated texture data with Free(). Use AutoAlloc to automate the allocation and destruction based on scope.

Returns
The allocated texture data, or nullptr if the allocation failed.

◆ Free()

static void Free ( TexData *&  td)
static

Destructs texture data allocated with Alloc(). Use AutoAlloc to automate the allocation and destruction based on scope.

Parameters
[in]tdThe texture data to destruct. If the pointer is nullptr nothing happens. The pointer is assigned nullptr afterwards.

◆ Init()

void Init ( void  )

Initializes the structure.

Member Data Documentation

◆ m

Matrix m

The texture projection matrix.

Note
This actual value may differ from those specified in the dialog, these are a precalculated raytracer representation.

◆ im

Matrix im

The inverse of the texture projection matrix.

◆ texflag

Char texflag

The texture flags: TEX.

◆ additive

Char additive

true to mix with other textures.

◆ proj

Char proj

The texture projection: TextureProjectionTypes.

◆ side

Char side

The side: SIDE.

◆ restrict

Int32 restrict

This is either 0 for no restriction or the index to a restriction in a RayObject
To check if global polygon id applies to TexData tex using VolumeData sd use the following:

if (tex->restrict)
{
if (!sd->op || sd->op->type!=O_POLYGON || tex->restrict>=sd->op->rscnt || !sd->op->rsadr[tex->restrict])
return false;
Int32 num;
sd->ID_to_Obj(id,&num);
if (!(sd->op->rsadr[tex->restrict][num>>5]&(1<<(num&31))))
return false;
}
return true;

◆ ox

Float ox

The X offset of the texture.

Note
This actual value may differ from the one specified in the dialog, these are a precalculated raytracer representation.

◆ oy

Float oy

The Y offset of the texture.

Note
This actual value may differ from the one specified in the dialog, these are a precalculated raytracer representation.

◆ lenx

Float lenx

The X length of the texture.

◆ leny

Float leny

The Y length of the texture.

◆ repetitionx

Float repetitionx

The repetition of U tiling.

◆ repetitiony

Float repetitiony

The repetition of V tiling.

◆ mp

The material.

Note
Make sure to cast this to the right material type before using it.

◆ uvwind

Int32 uvwind

The uvw index, access is through VolumeData::GetUVW().

◆ camera

BaseView* camera

The current view.

◆ uvbump

Char uvbump

The direct boolean representation of TEXTURETAG_UVBUMP.

◆ link

BaseTag* link

The originating texture tag.

◆ invLenx

Float invLenx

The inverted X length of the texture.

Since
R19.SP2

◆ invLeny

Float invLeny

The inverted Y length of the texture.

Since
R19.SP2

◆ parallaxUVW

Bool parallaxUVW

true if the UVW coordinates are changed by Parallax Mapping, otherwise false.

Since
R19.SP2