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;
}
PyObject PyObject * v
Definition: abstract.h:297
const Py_UNICODE size_t n
Definition: unicodeobject.h:1184
unsigned char * p
Definition: floatobject.h:87
maxon::Bool Bool
Definition: ge_sys_math.h:51
maxon::Int32 Int32
Definition: ge_sys_math.h:56
maxon::Float Float
Definition: ge_sys_math.h:62
#define TEX_TILE
Texture tile enabled.
Definition: c4d_shader.h:23
#define P_UVW
UVW.
Definition: c4d_raytrace.h:29
#define P_FRONTAL
Frontal.
Definition: c4d_raytrace.h:27
#define P_VOLUMESHADER
Volume.
Definition: c4d_raytrace.h:32
#define P_SPATIAL
Spatial.
Definition: c4d_raytrace.h:28
#define P_CUBIC
Cubic.
Definition: c4d_raytrace.h:26
#define P_SPHERICAL
Spherical.
Definition: c4d_raytrace.h:23
#define P_CYLINDRICAL
Cylindrical.
Definition: c4d_raytrace.h:24
#define P_SHRINKWRAP
Shrinkwrap.
Definition: c4d_raytrace.h:30
#define P_FLAT
Flat.
Definition: c4d_raytrace.h:25
static constexpr Float64 PI2
floating point constant: 2.0 * PI
Definition: apibasemath.h:118
Float32 ATan(Float32 val)
Definition: apibasemath.h:150
Float32 Sqrt(Float32 val)
Definition: apibasemath.h:168
Float32 Abs(Float32 val)
Definition: apibasemath.h:195
void SinCos(Float32 r, Float32 &sn, Float32 &cs)
Definition: apibasemath.h:270
Float32 ACos(Float32 val)
Calculates arccosine. The input value is clipped for safety to avoid exceptions.
Definition: apibasemath.h:249
PyObject * op
Definition: object.h:520
Definition: c4d_raytrace.h:244
Definition: c4d_raytrace.h:541
Int32 xres
Image horizontal resolution.
Definition: c4d_raytrace.h:546
Int32 yres
Image vertical resolution.
Definition: c4d_raytrace.h:547
Definition: c4d_shader.h:742
Float oy
Definition: c4d_shader.h:774
Int32 uvwind
The uvw index, access is through VolumeData::GetUVW().
Definition: c4d_shader.h:781
Char proj
The texture projection: TextureProjectionTypes.
Definition: c4d_shader.h:753
Float leny
The Y length of the texture.
Definition: c4d_shader.h:776
Matrix im
The inverse of the texture projection matrix.
Definition: c4d_shader.h:750
Float lenx
The X length of the texture.
Definition: c4d_shader.h:775
Float ox
Definition: c4d_shader.h:772
Char texflag
The texture flags: TEX.
Definition: c4d_shader.h:751
Definition: c4d_tools.h:1388
Vector GetPointUVW(const TexData *tdp, const RayHitID &hit, const Vector64 &p) const
Definition: c4d_tools.h:1822
const RayParameter * GetRayParameter() const
Definition: c4d_tools.h:1743
void GetXY(Int32 *x, Int32 *y, Int32 *scale) const
Definition: c4d_tools.h:1869
T y
Definition: vec.h:40
T x
Definition: vec.h:39
T z
Definition: vec.h:41
PI
Definition: unicodeutils.h:16

Public Member Functions

void Init ()
 

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 ( )

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;
#define O_POLYGON
Polygon object. The points and polygons are stored in RayObject::padr and RayObject::vadr....
Definition: c4d_raytrace.h:42

◆ 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