Jump to content
You are about to reply to a thread that has been inactive for 1010 days.

Please take a moment to consider if this thread is worth bumping.

Recommended Posts

Hello again,

I've never tried this before so not sure how it works. Would someone be able to enlighten me if it's possible to use a script to adjust the glossiness only of a prim? I tried prim_specular as with llSetPrimitiveParamsFast but it always wants a texture in the inventory. Is there another way?

Link to post
Share on other sites
// Materials applier basis

integer primnum = 1;
integer facenum = 1;
integer gloss = 150;
integer env = 25;
vector speccolour = < 1.00, 1.00, 1.00>;
vector diffcolour = < 0.95, 0.95, 0.95>;
float alpha = 1.0;

// diffuse / normal / specular maps
string texdiff = "<put the UUID of the diffuse texture map here>";
string texnorm = "<put the UUID of the normals texture map here>";
string texspec = "<put the UUID of the speculat texture map here>";

default{
    state_entry() {
// Here we go... delete the sub lines you don't need for diff texture, colour normals etc.
		llSetLinkPrimitiveParamsFast( primnum, [
    	PRIM_TEXTURE, ALL_SIDES, texdiff, <1.0, 1.0, 0.0>, ZERO_VECTOR,0.0,
    	PRIM_COLOR, ALL_SIDES, diffcolour, alpha,
    	PRIM_NORMAL, ALL_SIDES, texnorm, <1.0, 1.0, 0.0>, ZERO_VECTOR,0.0,
    	PRIM_SPECULAR, ALL_SIDES, texspec, <1.0, 1.0, 0.0>, ZERO_VECTOR,0.0, speccolour, gloss, env ]);

// ...or 
		llSetLinkPrimitiveParamsFast( 6, [
    	PRIM_TEXTURE, faenum, texdiff, <1.0, 1.0, 0.0>, ZERO_VECTOR,0.0,
    	PRIM_COLOR, facenum, diffcolour, alpha,
    	PRIM_NORMAL, facenum, texnorm, <1.0, 1.0, 0.0>, ZERO_VECTOR,0.0,
    	PRIM_SPECULAR, facenum, texspec, <1.0, 1.0, 0.0>, ZERO_VECTOR,0.0, speccolour, gloss, env ]);
	}
}

There... You just use the UUID's of the textures you want to set for spec (say a blank white texture for example, or the spec map you made for the item), 
 

  • Like 2
Link to post
Share on other sites

Thanks for the help Klytna and Rolig. Unfortunately that won't work for what I'm trying to accomplish. I have two meshes that are cut in many pieces linked together. I don't want to have to script each small piece with their correct spec map. I was hoping with the spec maps that I have applied before I linked them together that I would be able to adjust only the glossiness parameter with a script. If I use TEXTURE_BLANK, would that take off the applied spec map? I can try that at least see if it keeps what's there but only adjusts glossiness.

Edited by JackRipper666
Link to post
Share on other sites

Yes, it would replace your custom spec map. Since you already have the spec maps, though, just use their UUIDs. Making a SLPPF statement that addresses all of the child mesh elements is not terribly difficult, especially since you want to apply the same spec parameters to each one. You can create a single brief list variable with those params in it and then just paste it into the SLPPF statement following the link number and texture UUID for each link. That's what I normally do.

  • Like 1
Link to post
Share on other sites

If you have the correct permissions for the specular map texture you could use llGetLinkPrimitiveParams to get the key for the texture – indeed all the parameters – and just replace the glossiness parameter in the resulting list before feeding it back through to llSetLinkPrimitiveParamsFast.

Something like…

llSetLinkPrimitiveParamsFast (link_number, [PRIM_SPECULAR, face] + llListReplaceList (llGetLinkPrimitiveParams (link_number, [PRIM_SPECULAR, face]), [glossiness], 5, 5));

where link_number, face and glossiness are your specified parameters, and 5 is the position of glossiness in the list of parameters for PRIM_SPECULAR.

WARNING: not tested inworld, and posted after a glass or two of wine.

There's long been a desire, and maybe even a JIRA or two, for a LEAVE_IT_ALONE parameter to use in llSetLinkPrimitiveParams.

Edited by KT Kingsley
  • Like 1
Link to post
Share on other sites

That should work as long as you have the spec textures in your own inventory, but that will probably not be true if you intend to give the scripted item to someone else. However, it's easy enough to put the UUIDs into a list in your script and then refer to it as necessary when you create the SLPPF statement. 

  • Like 1
Link to post
Share on other sites

if it is just for yourself, you could mebbe do a user function with something like this in it?

( untested snippet)

integer new_Gloss = 250;
SET_GLOSS() // user func
{
        integer prims = llGetObjectPrimCount( llGetKey() ); 
        integer curr_link;
        for( curr_link = 1; curr_link <= prims; ++curr_link)  // cycle thru prims
        {
            integer numOfSides = llGetLinkNumberOfSides( curr_link );
            integer curr_face;
            for(curr_face = 0; curr_face <=  numOfSides; ++curr_face)      // cycle thru faces per prim 
            {
                 list params  = llGetLinkPrimitiveParams( curr_link, [ PRIM_SPECULAR, curr_face ]);
                 string  S_texture = llList2String( params,0 );
                 vector  V_repeats = llList2Vector( params,1 );
                 vector  V_offsets = llList2Vector( params,2 );
                 float   F_rotation_in_radians = llList2Float( params,3 );
                 vector  V_color = llList2Vector( params,4 );
                 integer I_glossiness  = llList2Integer( params,5 );
                 integer I_environment = llList2Integer( params,6 );
                 
                 I_glossiness  = new_Gloss;       
         
                 llSetLinkPrimitiveParamsFast( curr_link,
                  [ PRIM_SPECULAR, curr_face,
                    S_texture,
                    V_repeats,
                    V_offsets,
                    F_rotation_in_radians,
                    V_color,
                    I_glossiness,
                    I_environment 
                  ]);
             }
        }
}

 

Edited by Xiija
  • Like 1
Link to post
Share on other sites

Because most of those params are simply repeated for each link, you can compress them into a single list ...

list params = [<1,1,1>,ZERO_VECTOR,0.0,<1,1,1>,51,2];

Then your SLPPF statement looks something like

llSetLinkPrimitiveParamsFast(LINK_SET,[34,1,PRIM_SPECULAR,texture1]+params+[34,2,PRIM_SPECULAR,texture2]+params+ ...);

and so on. I'm sure that I left out a param (I am away from home and creating this from memory) , but that's the general idea.

  • Like 1
Link to post
Share on other sites
11 hours ago, JackRipper666 said:

Unfortunately that won't work for what I'm trying to accomplish. I have two meshes that are cut in many pieces linked together. I don't want to have to script each small piece with their correct spec map. I was hoping with the spec maps that I have applied before I linked them together that I would be able to adjust only the glossiness parameter with a script.

Check the lsl wiki for llSetLinkOrimitiveParamsFast, you'll find that there's syntax for specifying "blocks" for different prims, so ...

llSetLinkPrimitiveParamsFast(

            [block for prim 1 all faces using list entry texturespec(1)]  

            [block for prim 1 face 4 using list entry texturespec()2)]

 //if say 6 faces on a prim use 1 texture and 1 uses a different texture, its faster to set all_sides first then set thye odd one out separately afterwards, than setting all 6 one at a time 

<snip>

            [block for prim 36 using list entry texturespec(36)]

);

And Xiija's code shows how to grab the existing  prim/face spec textures, so you grab the textures for the linkset prims, stick them in a list, and then your multi block llSetLinkPrimitiveParamsFast command can set the specular glossiness with the current textures for each prim/face, all in one go, 

This is how mesh body appliers change all the pieces together rather than one at a time with a 0.2 second delay between pieces as you "mosaic" into a different skin, or tattoo or clothing layer.

However, while you can get the textures on your own stuff, if it's for a product you intend to give or sell to others, just use a list definition line at the top of the script with the uuid ofeach texture in the order you'll apply them.

list texturespec =

  1. ;



 

  • Like 1
Link to post
Share on other sites
On 5/31/2018 at 10:18 AM, KT Kingsley said:

If you have the correct permissions for the specular map texture you could use llGetLinkPrimitiveParams to get the key for the texture – indeed all the parameters – and just replace the glossiness parameter in the resulting list before feeding it back through to llSetLinkPrimitiveParamsFast.

Something like…

llSetLinkPrimitiveParamsFast (link_number, [PRIM_SPECULAR, face] + llListReplaceList (llGetLinkPrimitiveParams (link_number, [PRIM_SPECULAR, face]), [glossiness], 5, 5));

where link_number, face and glossiness are your specified parameters, and 5 is the position of glossiness in the list of parameters for PRIM_SPECULAR.

WARNING: not tested inworld, and posted after a glass or two of wine.

There's long been a desire, and maybe even a JIRA or two, for a LEAVE_IT_ALONE parameter to use in llSetLinkPrimitiveParams.

Thanks everyone for your help! Much appreciated! I am going to give this a try as I'm really trying to just target the glossiness only as I have spec maps manually plugged in.

Link to post
Share on other sites
You are about to reply to a thread that has been inactive for 1010 days.

Please take a moment to consider if this thread is worth bumping.

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...