PDA

View Full Version : Inserting functions


fred22
08-25-2003, 11:41 AM
How do I use a function that is inside the sl I have written. I don't have my example code with me.

{
function.....
}

displacement = function....

something like that... a bit vague I know but any help would be grand. Thanks heaps.

aurora
08-25-2003, 02:45 PM
OK, first I have to admit I have no idea what you are really trying to ask so heres a pretty vanilla answer.

float foo()
{
do something
return a;
}

void footoo()
{
float b;
b = foo();
}

If that does not answer your question try finding your example code and I'll give answering it another shot.

rendermaniac
08-25-2003, 03:05 PM
If you are talking about RenderMan SL then you can only use floats - there are no doubles or int types.

You should definitely get Advanced RenderMan (http://www.amazon.com/exec/obidos/ASIN/1558606181/rendermania-20/103-2559086-3168627) by Antony Apodaca and Larry Gritz if you are learning SL. Both of them were involved in creating/updating the RenderMan standard. (Tony still works at Pixar).

aurora
08-25-2003, 08:51 PM
That is absolutely right about Renderman's SL. I was trying to make it as vanilla as possible and since I just added a few billion new doubles to the program I was working on at the time I just used doubles without thinking about it. I'll go edit it just for safety's sake.

fred22
08-27-2003, 10:32 AM
Well the example is in the book you speak of.... The worely noise function that is spoken of in Advanced renderman. I worte the code, then tried to add it to a shader. It wouldn't compile correctly, could that be because I am using pixie??

I think the vanilla answer gives me a good idea. I could have been trying to use the return variable instead of the function itself. Thanks

I will post the code in a couple of days as I forgot it again. Thanks for the help.

aurora
08-27-2003, 02:46 PM
If you wanted to use a member variable you could do this

float m_a;

float foo()
{
float a,b;
Do something
m_a = a+b;
return a;
}

void footoo()
{
float a;
a = m_a;
}

rendermaniac
08-27-2003, 06:02 PM
Using global variables is BAD!!!! Plus renderman doesn't let you do it anyway .

If you want to pass by reference then just add output infront of the variable you pass into your function

float foo(output varying float m_a)
{
float a,b;

/* DO SOMETHING */

m_a = a + b;
return a;
}

and call as

float m_a;
answer = float(m_a);

Which is a good way of getting back two values from a function.

RenderMan has scoping anyway so to access a global variable you have to declare it as extern in the function. You even have to do this for P,N etc and L and Cl in illuminance loops (although some compilers let you get away with it).

Just had a look at voronoi which I guess is the one you mean. If you look the return type is void. ie it doesn't return anything! All the values you get back through output variables. A lot of functions are going this way.

So you need to create empty variables, call the function

float a,b,c;
function(a,b,c);

And your empty variables will magically be filled! AKA pass by reference.

Simon

CGTalk Moderation
01-15-2006, 11:00 PM
This thread has been automatically closed as it remained inactive for 12 months. If you wish to continue the discussion, please create a new thread in the appropriate forum.