Material Plugin - no clue

THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED

On 15/05/2011 at 14:41, xxxxxxxx wrote:

User Information:
Cinema 4D Version:   R12 
Platform:   Windows  ;   Mac OSX  ; 
Language(s) :     C++  ;

---------
With only three slim examples in the cinema4dsdk and little information here, how am I supposed to write a MaterialData plugin which handles a bunch of 'channels' (such as color, diffuse, specular, etc. - not ChannelDatas)?  Look at this list of classes and structures involved and then back at the skimpy, small, insignificant amount of information and tell me how I'm supposed write something like this.

Material
BaseMaterial
MaterialData
VolumeData
BaseVolumeData
Ray
RayObject
IlluminationModel
InitRenderStruct
SurfaceData
RenderData
Render
MatPreviewType
RenderPreviewImageCallback
MatAssignData
MatAssignTable
Multipass
VPBitmap
Multibitmap
RayLight
MaterialPreviewCustomGui
MaterialPreviewData
MaterialPreviewObjectInfo
MaterialPreviewGenerateImage
MaterialPreviewModifyCacheScene
MaterialPreviewPrepareScene
MaterialPreviewCopyUserData
MaterialPreviewHandleDragnDrop
TextureTag
MatAssignCustomGui
MatAssignData
MatAssignTable
TexData
IlluminationSurfacePointData
RayHitID
IlluminationSurfacePointModel
RayCamera
RayParameter
RayEnvironment
RayPolyWeight
PolyVector
BaseVideoPost
VPFragment
LensGlowStruct
SurfaceIntersection
VPBuffer

C4D_Falloff
FalloffData

It's pretty certain that this isn't a complete list (and easy classes have been omitted obviously).  Examples!  I need examples!  How would I map a bitmap onto a surface given this choice of hundreds of classes, structs, values?  I have no idea because there are no examples.  Lots of fragmentary information and simplistic full examples.  Not helping.  Please help!

Thanks,

THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED

On 17/05/2011 at 06:50, xxxxxxxx wrote:

A good idea is to take apart the SimpleMaterial.cpp example. It shows how to add to channels, diffuse and specularity. All the calculations in this example are done within CalcSurface and the illumination model hook SimpleIllumModel. In CalcSurface you have access to the VolumeData of the material to set for instance the rendered color. It will provide you with the current rendered surface's UVW coordiantes, normal etc. Also it's possible to fill the multipass buffers for the diffuse and specular component there.

To present the user with some channels is just a matter of the interface. Check the resource files of some of Cinema's materials to get an idea how it's done, for instance mmaterial.res.

cheers,
Matthias

THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED

On 17/05/2011 at 15:05, xxxxxxxx wrote:

Presenting the interface to the channels is easy enough.  Already have the working framework for that.

That is exactly how I started.  I took the SimpleMaterial example and used it as a starting point for my Material plugin.  Yeah, I can understand setting the color and the specular overall.  But VolumeData is a massive class with many methods and even more variables. Add in the TexData and Multipass classes and it is even more massive.  It could take months of experimentation and trial&error to even start getting a grip on what works, what doesn't, what is needed or not for certain aspects (image mapping, shadows, displacement, bump, etc.).  Eventually it will also be required to have the material's setting reflected in the editor (e.g.: OpenGL).  This isn't even exemplified in the sdk examples.

For instance, you mention that the surface's UVW coordinates (etc.) are passed.  It looks like one UVW vector is attached to the VolumeData.  Is CalcSurface(), as an example, called for each pixel of the render or for some subdivision of the UVW space or just once (per cpu) per render?  This information is not given anywhere (and I've been going through the SDK docs, examples, and here for many tireless days).

What would be more educational would be a 'simple' example code which shows a call sequence like that shown in MaterialData::InitCalculation().  InitCalculation() itself, for all of its supposed importance, isn't used in a single sdk example. 😞

THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED

On 18/05/2011 at 00:59, xxxxxxxx wrote:

Maybe you can tell what you want to achieve. As for CalcSurface, it is called for each pixel or sub-pixel if antialiasing is used. BaseVolumeData::uvw is the current UVW coordinate on the rendered surface. For materials where you don't have to pre-calculate a lot of data InitCalculation is not needed.

cheers,
Matthias