Tuesday, January 30, 2007

Intellectual property and patents -- I don't think so

I got home to an interesting notecard from Jerry Martin, creator of a skirt generator that is sold on SLexchange.

I initially posted his notecard to me, but because a notecard might be construed as part of a "conversation", which would be against LL ToS to post under resident's expectations of privacy, I've removed it. The bottom line is that he tells me he has applied for a patent of his dress-making "invention," and that he suggests that I should be aware of the "patent pending" status of his "invention."

This is rather interesting to me, but doesn't make me overly concerned. I wonder what portion of LoopRez infringes on his yet-to-be granted patent? Possibilities include:
  1. the parametric definition of an ellipse, consisting of:
    • x = a cos (t)
    • y = b sin (t)
  2. dividing 360 degrees (or 2*PI radians) by the number objects you wish to place radially symmetrically
  3. the equation for a tangent unit vector at a position on an ellipse, which is published in equations 89 and 90 at Wolfram's Mathworld
  4. applying a fixed rotation to an object around a local axis (the "flare" rotation)
  5. using llRezObject?
Another reason that I'm not terribly concerned, and would be happy to challenge his "patent", in the unlikely event that the United States Patent and Trademark Office were to grant it, is that it fails to meet 2 of the 3 criteria that all patentable inventions require: "new / novel" and "non-obvious." Multiple people have independently come up with the same method to place objects along an elliptoid path in space, including Ariane Brodie and Johanna Hyacinth.

My public reply to Jerry Martin:

Thank you for your notecard correspondence, which this time was readable. While interesting, I am going to proceed with my plans. Patent protection does not start until the actual grant of the patent. Feel free to inform me when this has taken place.

As you know, intellectual property of patentable inventions requires certain attributes, including new/novel, useful, and non-obvious. While the concept of the various "skirt generators" may be useful, the other 2 criteria are likely not met.

This idea may not be novel, as Ariane Brodie long ago released a script into the public domain that rezzed objects in SL in the pattern of a modified ellipse (http://virtualunderworld.net/arianeb/secondlife.htm). The mathematics she used to place the objects at a proper tangent angle were incorrect, but the tangent equations are also in the public domain, at http://mathworld.wolfram.com/Ellipse.html, equations 89 and 90. It was an "obvious" improvement to correct Ariane Brodie's incorrect mathematics to substitute in the correct tangent vector.

Finally, once in the public domain, it is usually not possible to successfully obtain IP rights. I point out that I freely released the LoopRez v0.6 script into the public domain, which includes both the non-original concept of placing objects in an ellipse, as well as the corrected mathematical formula of tangent vectors.

Again, thank you for your note. I will be posting our correspondence publicly as a matter of record at http://slged.blogspot.com.

Ged Larsen

I then proceeded to release LoopRez Deluxe, with the following response:

February 1, 2007

Ged Larsen

I have just spoken with an attorney and been advised to ask you
to cease and desist all and any occurances and references
pertaining to any device you have that infringes on my intellecual
property and or patent rights . Your looprez used as a device to
manufacture prim skirts or dresses clearly infringes upon my patent
pending process. Your failure to abide by and defience of United
States Patent Law , reluctance to discontinue sales and
distribution along with a public announcement to proceed with sales
and distribution after you were notified of the patent pending
status , clearly demonstate and consitutes willfull patent rights
infringement on your part. A snapshot has been taken of your blog
known as (geds anti-blog) to be used as evidence in the event a
trial takes place and will also be sent to Linden Labs legal
department .

Also if nessesary a court ordered Cease and Desist Order
prepared by an attoney will be presented to Linden Labs to wipe
their servers clean of your infringing product including any of
this product sold to other residents . That will cost me 3-5
hundred dollars to have done and I do intend to recover all and any
expenses that are a direct result of any legal actions that take
place against any person or persons that break the law by patent
right infringment on my product .

In addition I am drafting letter to be sent to the DMCA to
inform them that a copyright and patent right infringement of a
patent pending product is taking place on the servers at Linden
Labs .

In all fairness I will allow 24 hours for you to remove the
infringing product and any references to it being used to
manufacture prim skirts and dresses . Failure to comply will
put you at risk of further litigation and legal action brought
against you in a U.S. Court of Law .

With kind regards ,
Jerry Martin , Fashionetics

I don't think his claims have merit.

Saturday, January 27, 2007

LoopRez for making buildings

I came across a blog entry: ArtsPlace SL: LoopRez and buildings, where there's a very nice example of a building created with some assistance from LoopRez.

The enclosure looks very bright and airy.

Sort of made my day to know the script was helpful to someone :)

I'll be away for the next half week. Will I survive SL scripting withdrawal?

LoopRez Deluxe Documentation

LoopRez Deluxe Documentation

This is primarily a list of commands. If you are new to using LoopRez Deluxe, the following are the most useful places to start:

Command List

  • rezzed panels are automatically linked together
  • must be typed BEFORE rezzing the panels
  • type it again to turn it off
  • causes a 1 second per panel delay (because LSL's llCreateLink command forces a delay)
  • with Second Life being so buggy and laggy, some users were unable to link more than 6-8 panels at a time; this command should bypass that problem, at the cost of a 1 second per panel delay

  • adds an extra ## degrees of flare angle to the backside of a skirt
  • helps prevent the effect of prim panels emerging from the buttocks and upper thighs of avatars

  • changes the channel that LoopRez Deluxe listens on for chat commands
  • i.e., if you typed /1 channel 0; all subsequent commands would be listened to on the public, regular chat channel
  • default is 1

/1 CIRCLE ##
  • changes both WIDTH and DEPTH to ## meters, forming a circle instead of an ellipse

/1 DELAY ##
  • delays panel rezzing by ## seconds between each rez
  • helps if you are having problems running in the SL "grey goo" barrier
  • if the "grey goo" barrier prevents some panels from rezzing, the best way to recover is:
    • select and link all the panels that DID manage to rez with the central Metal Ball
    • issue a /1 DIE command
    • increase /1 DELAY to 0.5 or 1 second
    • touch the rezzer again to re-rez the panels

/1 DEPTH ##
  • changes the front-to-back DEPTH of the skirt to ## meters
  • contrast to /1 WIDTH

/1 DIE
  • causes all panels LINKED to the central Little Metal Ball to delete themselves
  • does NOT reset the scripts, so parameters are retained for use with the next rezzing (i.e., number of objects, width, depth, and seen prim parameters / textures)
  • contrast with /1 RESET

  • issues when you are FINISHED with the skirt
  • causes all scripts with the skirt panels to self-delete, as well as re-linking the skirt to a new central object

  • this toggles between placing the skirt panels evenly around the ellipse versus allowing them to bunch up a little bit on the ends
  • even spacing is a LOT slower, but might look better with low flare angles
  • the default is NOT even spacing, which is faster and generally looks better with the usual flare angless

/1 FLARE ##
  • this adjusts the number of degrees that each skirt panel will "poof" outwards
  • 90 degrees has the panels sticking straight out, like a ballerina's tutu; 0 degrees has the panels all hanging straight down
  • /1 BACKANGLE adds extra flare angle to the backside of a skirt

  • lists the available commands and current settings

/1 NUMBER ##
  • changes the number of skirt panels to rez
  • if entered AFTER a skirt has already been rezzed, will make the existing panels disappear, and then re-rez the new number of panels, and then (new to v0.8) re-apply any skirt prim parameters it has seen to all the newly rezzed panels
  • limited to 60 now, but if more are needed, the theoretical maximum would be ~255

/1 OBJECT ##
  • changes the name of the Object within the central Little Metal Ball that is rezzed; the default name is "Object"
  • this object MUST contain the morphTarget script
  • the creator of this Object becomes the creator of the final finished skirt (AFTER the /1 DONE command is issued), so replacing this object is the goal of reconfiguring LoopRez Deluxe Commercial Edition to change the skirt creator listed
    • Commercial Edition Users could conceivably load multiple objects with different names, and use this command to have lots of different "starting panels" available

  • this activates the Skirt Programmer to execute a notecard named "##"
  • it MUST be run AFTER the panels have all been rezzed and linked
    • it's probably best to run this command as the LAST thing you do before the /1 DONE command
  • the Skirt Programmer allows you to define a program of skirt panel sizes or colors that varies from panel to panel, all the way around the skirt
  • the notecard must be in the central Little Metal Ball
    • LoopRez Deluxe ships with two notecards in the Little Metal Ball: "skirt rainbow" and "skirt open front"
    • examine these notecards to get a sense of how your own Skirt Programs could be written
  • Skirt Program Notecards
    • must be in the little metal ball
    • start with a line "type~size" or "type~color"
    • optionally follow with the lines:
      • "alpha~##" (## is the color alpha, default 1.0), or
      • "face~##" (## is an integer describing which face to color, default ALL_SIDES)
    • lines:
      • 0~<X, Y, Z> (vector describing the starting size or color at 0 degrees, facing forward)
      • any number of lines ##~<X, Y, Z>, describing size / color at points moving around the skirt to the left
      • 360~<X, Y, Z> (vector describing the end position size or color, after coming completely around the skirt)
  • this command is complex enough that I can't promise to fully support it; think of it as a potentially powerful freebie that's included

  • causes all panels LINKED to the central Little Metal Ball to delete themselves
  • and then RESETS the scripts, so all parameters are returned to default settings
  • clears the "prim parameter" memory, so newly rezzed objects will not have the prim parameters of the previous object
  • contrast with /1 DIE

/1 ROTX ##
  • changes the rotation of each panel, around its X-axis
  • if your panels are upside down, but facing outwards correctly, "/1 ROTX 180" might help
  • changing this might mess up the evenness of the hemline

/1 ROTY ##
  • changes the rotation of each panel, around its Y-axis
  • if your panels are upside down and inside out, "/1 ROTY 180" or "/1 ROTY 0" might help
  • changing this might mess up the evenness of the hemline

/1 ROTZ ##
  • changes the rotation of each panel, around its Z-axis
  • if your panels are outside facing in, "/1 ROTZ 180" might help

  • this simulates a "touch" on the central Little Metal Ball, to either start rezzing panels, or receive status information
  • here, because I'm too lazy to click the ball

/1 WIDTH ##
  • changes the side-to-side WIDTH of the skirt to ## meters
  • contrast to /1 DEPTH

LoopRez Deluxe Commercial Edition, creator configuration

LoopRez Deluxe Commercial Edition has the same functionality and features of the Personal Edition except:
  1. created skirts are TRANSFER, as well as MOD / COPY, so you can sell your creations
  2. with configuration, the CREATOR of the skirt can be changed to yourself
This document describes the somewhat annoying procedure of getting LoopRez Deluxe Commercial Edition configured such that you are listed as the creator. (Don't try this with the Personal Edition -- it will break the script.)

Note: even after being properly configured, skirts that are "In progress" (i.e., before the "/1 DONE" command is sent), will still list Ged Larsen as the creator. This is because the little metal ball that is the root prim during skirt generation is owned by me.

However, after the "/1 DONE" command is sent, the root prim will be swapped over to a little metal ball look-alike, and so the final linked product will list YOU as the creator.

How to re-configure LoopRez Deluxe creator information
  1. Make a backup of your LoopRez Deluxe Commercial Edition package
    • just in case anything goes wrong, you can always start again

  2. Rez a copy of your LoopRez Deluxe object

  3. Delete "Object" out of the inventory of the little metal ball of LoopRez Deluxe
    • i.e., right-click the little metal ball; then select the Contents tab; then right-click "Object" inside the Contents tab and select delete
    • "Object" is the source of each skirt panel; its Creator becomes the creator of the skirt. Your goal in the following steps is to replace the "Object" I created with one that YOU create, so you'll be the new Creator. The annoying part is getting the required script inside it, too.

  4. Create a prim from scratch. Don't change its name, just leave it "Object"
    • i.e., click the Create button (or press CTRL-3), select a prim type, and rez it
    • create it yourself, because this prim will determine the "Creator" of your future skirts
    • you can use just a plain block, OR, you can shape, color, and texture it / set commonly used flexi settings. These settings will be the default initial settings of each panel of skirts that you generate in the future

  5. Drag the MorphTarget script into the contents of your "Object"
    • i.e., click on your new Object and select the Contents tab. Then, drag the MorphTarget script into the Contents

  6. Right-click and "TAKE" your "Object" (now containing the MorphTarget script) back into your inventory

  7. Drag your "Object" (containing the MorphTarget script) from your inventory, INTO the contents of the little metal ball

  8. Select both the pose stand and the little metal ball, and "TAKE" it into your inventory
    • have the edit menu open (CTRL-3), and then LEFT-mouse-click and DRAG a box surrounding the 2 items (thereby selecting them both), and then RIGHT-click one of the items to bring up the pie menu to "TAKE" both items at the same time, into inventory
    • this is your new, customized LoopRez Deluxe, which will generate skirts with YOU as the creator
    • I'd suggest moving the modified generator into a clearly named new folder
    • if you obtained your LoopRez Deluxe after 5-Feb-2007, you might be able to rename the modified LoopRez Deluxe generator (I fixed permissions on 1 recalcitrant object); I need to test this. If it works, it will be included in the next update
    • make a backup copy of it too, so you ever mess up in the future, you won't have to go through these steps again
I told you the steps were annoying, sorry. But, if it all worked, you won't have to do it ever again.

LoopRez Deluxe FAQ

LoopRez Deluxe Frequently Asked Questions
  • Q: Only some panels rezzed, and now LoopRez isn't working / is doing weird things
  • A: Two things to try (see also "Grey Goo" below):
    • Remove any rezzed panels, by issuing a DIE command:
      • select and link any remaining panels to the little metal ball
      • type "/1 DIE"
      • this will make the leftover panels go away, and you can try again, with the previously set "number, flare, width, depth" settings all intact
    • OR, remove any rezzed panels, and then issue a RESET command:
      • select and link any remaining panels to the little metal ball
      • type "/1 RESET"
      • this will make the leftover panels go away, then reset all scripts back to their default settings (losing any previously entered number, flare, etc. settings)
  • Q: the panels are all upside down / sideways / inside out -- what do I do?
  • A: use the /1 ROTX ##, /1 ROTY ##, /1 ROTZ ## commands. For a BLOCK-prim, the following are good places to start:
    • upside down: /1 ROTX 180
    • sideways: /1 ROTX 90, or /1 ROTX -90
    • inside out: /1 ROTZ 180

  • Q: Hey! The skirt says that YOU are the creator! How do I change the creator to me?
  • A: The process is annoying, but here's a description of the steps you have to go through to re-configure the skirt object. Sorry it's so convoluted, but SL doesn't make it easy to work with the credited "Creator"

  • Q: What's the difference between the Personal and Commercial Editions?
  • A: The functionality of both editions is IDENTICAL. But, skirts generated with the Personal Edition are NO TRANSFER, so you won't be able to give away or sell those skirts. Commercial Editions skirts can be transfered. However, the actual skirt generator itself is NO TRANSFER in BOTH editions.

    With LoopRez Deluxe v0.81, "Edit Linked Parts" can be used to edit a panel of a rezzed skirt in progress; "Touching" the edited panel then propagates the change through the rest of the skirt. For the Commercial Edition, all prim parameter attributes are transfered. However, because of permissions issues, with the Personal Edition, all parameters except texture are transfered. Textures can still be set and propagated using the DropScript.

  • Q: What's the policy on upgrades?
  • A: All upgrades will be free for both Commercial and Personal Editions, and will be automatically sent to all users. If you do NOT wish to receive updates, let me know and you will be removed from the update list. In addition, all upgrades will be announced on the "LoopRez Users" group in Second Life, so if you don't receive an upgrade (or accidentally remove it), let me know.

  • Q: why are there all those little green asterisks?
  • A: they are to remind you that there are still active scripts in each skirt panel. When you are finished adjusting your skirt, issue the /1 DONE command, and the scripts (and floating asterisks) will go away

  • Q: How do I click on the metal ball for info, when it's blocked by a posing avatar?
  • A: You can click on the pose stand instead, or type "/1 TOUCH" which simulates a touch event on the metal ball. You can also type "/1 HELP."

  • Q: Why don't you link the rezzer and pose stand? Having them unlinked means sometimes pieces get left behind when taking back into inventory.
  • A: They are unlinked because the little metal ball should be able to be positioned freely. For example, if you wanted to design a shoulder cuff, you can pose, and then both move AND rotate the metal ball with its attached panels into proper position at the arm. This wouldn't work as well, if the pose stand was linked.

    The pose stand is actually completely dispensable. Feel free to use whatever pose stand you prefer.

  • Q: Grey Goo? I tried to rez 40 panels, not all the panels rezzed, and an error icon popped up that said I hit a "Grey Goo" barrier? What do I do?
  • A: SL's "grey goo" fence is to prevent griefers from using object rezzing from crashing sims. LoopRez Deluxe is made to be as fast as possible, and can activate the grey goo barrier. Version 0.8 of LoopRez Deluxe has a a "/1 DELAY ##" command which will make the panels rez more slowly, and avoid triggering the grey goo fence.

    Best recovery method:
    • select the panels that DID rez, and link them to the little metal ball
    • issue a "/1 DIE" command (removes the panels that did rez)
    • issue a "/1 DELAY 0.8" command (delay of 0.8 seconds between rezzes)
    • "Touch" the little metal ball again, to re-rez

  • Q: I can't link more than 6 or 8 panels.
  • A: This seems to be due to bad lag / packet loss, or a bug in SL itself. With LoopRez Deluxe v0.8, the "/1 AUTOLINK" option was added, to get around the need to link things yourself, at the penalty of a 1 second per panel delay.

    To use it, BEFORE you "Touch" to rez any panels, issue the /1 AUTOLINK command, and THEN "Touch" to rez your panels.

  • Q: When I use the Skirt Programmer, I get a math divide by zero script error?
  • A: There's been some confusion about when to use the SkirtProgrammer. Essentially, what you need to do is ALL the things to generate a skirt, and THEN run the /1 PROGRAM command. The Skirt Programmer works on a skirt that has already been rezzed, but NOT yet completed with the /1 DONE command.

LoopRez Deluxe Known Issues

These come directly from you, so if you're having problems, or have suggestions, please let me know!

Bugs / Problems
  • when Skirt Programmer is run before a skirt is rezzed, it gets a divide by zero error (because it thinks a skirt with ZERO panels is there). Skirt Programmer should be changed to know when it's being run inappropriately.

LoopRez Deluxe Tutorial

This is an introduction tutorial for getting started with LoopRez Deluxe.

Lesson 1. Make a customized skirt in seconds

1. Drag the LoopRez Object from your inventory onto the ground
  • there will be a pose stand and a small metallic ball
  • IF the dialog window pops up, give permission to change links (it shouldn't ask again, unless you rez a NEW copy of LoopRez, or if you use the /1 RESET command)

2. Set the number of panels, by chatting the following command:
  • /1 number 24
  • this sets the number of panels to 24
  • the /1 is the channel number that LoopRez Deluxe listens on by default

3. Touch the small metallic ball (or the pose stand)
  • LoopRez Deluxe will rez 24 panels, but they'll be scattered about messily, not looking very skirt-like -- they are waiting to be linked together

4. Link together ALL the panels AND the small metallic ball (but NOT the pose stand)
  • the easiest way to select them all is to:
    • press "CTRL-3" to put you in edit mode
    • and then DRAG a box around all the panels and the ball (but NOT the pose stand)
    • and then press "CTRL-L" to link all the selected objects
  • you should now gasp out "ooh! aah!" as all the panels now zip around and arrange themselves into a perfectly placed flexi prim skirt

5. Now is the fun part! Customize the shape and size of the skirt by chat commands
  • the most useful commands to start with are: FLARE ##, WIDTH ##, DEPTH ##
    • try typing: /1 flare 80
      • the panels will flare outwards to 80 degrees, resembling a ballerina tutu
    • try typing: /1 flare 10
      • the panels will drop nearly straight downwards, to just 10 degrees outwards
    • if you type: /1 flare +10 or /1 flare -5 (notice the "+" or "-") the flare angle will be increased by 10 degrees, or decreased by 5 degrees, from whatever the current setting is
    • find a setting that you like
    • try typing: /1 width +0.02
      • the waistline width of the skirt will be increased by 2 cm on each side
    • try typing: /1 depth -0.01
      • the waistline depth of the skirt will be decreased by 1 cm on each side
    • standing on the pose stand and/or dragging the skirt in progress around, can help you fine tune
    • find a setting that you like

6. Chat the following command: /1 done
  • the scripts will now clean up after themselves, so you don't end up with a 24 prim skirt with 24 active scripts lagging you out
Congratulations! You have just made a customized 24-panel flexi-prim skirt.

(The following section is incomplete, needs pictures, some suggestions for specific prim parameters.)

Lesson 2. Applying colors and textures, and any other prim parameter, to customize your skirt panels using the DropScript

1. As above, create a skirt, but DON'T do the "/1 done" command yet

2. Create a new prim with the color and/or texture that you want to use, and place it near the LoopRez Deluxe object
  • it can even be just a standard 0.5 meter prim cube
3. Drag the "Template Parameter DropScript" onto your colored / textured cube

4. When the dialog window pops up, click the "Color" button or the "Texture" button
  • after a pause, whichever option you picked should get transferred to the prim skirt
5. In fact, this is how you will create custom panels for your skirts, instead of using the default one!
  • customize your colored / textured cube, to become a new skirt panel
  • for example, you could try:
    • under Object, set size to X = 0.01; Y = 0.3; Z = 0.7
    • under Features, turn on Flexible
    • under Texture, play with the colors / textures some more
  • when you are done, touch the panel (if the DropScript is already running), or else drop the DropScript, and then select the appropriate buttons to transfer whichever attributes you want

Lesson 3. Applying colors and textures, and any other prim parameter, to customize your skirt panels using "Edit Linked Parts"

Like the"Template Parameter DropScript," Edit Linked Parts also allows you to adjust the skirt after it's been rezzed, but this time by editing the actual skirt that you're working on. The panels can be edited in place, and the changes propagated through the rest of the skirt in progress. Here's how:

As above, create a skirt, but DON'T do the "/1 done" command yet
  1. First, you rez and link your skirt, just as before. Then bring up the edit window and check off the "Edit Linked Parts" checkbox:

  2. After clicking the checkbox, click on any panel you'd like to edit to select it, and make all changes as you would normally do. Here, I've applied a texture to the outward-facing surface.

    NOTE: Edit Linked Parts and textures don't work with the Personal Edition; all other changes will work: try editing shape or size. This is due to a subtle permissions bug, and can't be fixed.

  3. Finally, "touch" the panel you just edited. Because you have an edit window up, the easiest way to activate a touch is to RIGHT-CLICK the panel you just edited, and choose TOUCH. All parameters will automatically be transmitted, and the changes will spread to the rest of the skirt.

    The Personal Edition will not be able to spread textures, because of the permissions system in place. However, all other prim parameters will be transmitted.

  4. Voila! The entire skirt is updated, and you didn't have to go around dragging any panels to the ground or scripts from inventory.

LoopRez Deluxe video

Here's my first attempt ever at saving a movie and sending it to YouTube. It came out both bigger and blurrier than I thought it would. But for now, it might give you an idea of what LoopRez looks like in action.

This is what you're looking at, in the video:
  1. "touch" the rezzer, to generate 24 panels
    • initially, they are all scattered and unlinked

  2. select all and link

  3. LoopRez Deluxe detects the link, and zips them all into a skirt shape, with panels all facing the correct direction

  4. the "flare" angle is changed a few times

  5. the "width" is increased a little bit, and then decreased again

  6. the "DropScript" is used, using attributes from both of the panels lying off to the side
    • first the "shape" is changed to make it longer
    • then the "flexibility" is adjusted
    • finally the "texture" of the black panel is transferred

  7. the skirt is "finished"
    • all the scripts are removed from the skirt panels
    • the completed skirt is left linked to a root prim that is perfectly centered

  8. voila!
Again, sorry it's a big and blurry download.

Introducing LoopRez Deluxe

Helpful Links

The original LoopRez is a freely distributed script to simplify placing objects precisely around the perimeter of an ellipse. It's particularly helpful for panel placement in flexi prim skirts. The script has been mentioned in a Natalia Zelmanov's great blog on SL clothing design, and has been used in a TUi class on making skirts in SL.

Although the LoopRez script is fairly easy to use, it isn't optimized for repeated parameter adjustment, to get just the look desired. For example, making the skirts "poof" out a little bit more, changing the number of panels, tweaking how long the skirt is, or adjusting flexi prim properties, all gets rather tedious.

LoopRez Deluxe

LoopRez Deluxe was designed to be as flexible and powerful as possible, streamlining the process, to minimize tedious adjustments and script editing. The goal was to achieve real-time, interactive adjustment of the final product.

Here's a video of LoopRez Deluxe in action.

Ms. Zelmanov trying out the new LoopRez (oh, and the cool Captain's outfit is courtesy of Miss Virrginia Tombola):

Here are some of the new features:

Chat commands

Speaking commands allows on-the-fly modification of all the basic LoopRez parameters. In other words, as you chat a command, the skirt panels will interactive shift and rotate into their new positions, so you can immediately see the adjusted final product.

Parameters that can be changed interactively with chat commands include: number of skirt panels, side-to-side width, forward-to-back depth, how much the panels "flare" outwards, an optional increase in flare angle in back (*NEW!* ) to minimize panels emerging from the upper thighs of avatars.

Panel parameter adjustments: the Parameter Template DropScript

If you've ever wanted to try out different "flexi" properties, lengthen a skirt panel, or change a texture, the Parameter Template DropScript should speed the design process significantly. Just rez a prim, which has some desired primitive property in it, and drop the "template" script onto it. "Touch" the panel, click a button in the resulting dialog window, and your adjustments will be immediately reflected in your skirt.

Nearly every prim property can be adjusted: shape, size, color, texture, flexi, lighting, etc. It's more clear when seen, than when described.

Update with version 0.81: "Edit Linked Parts" on a skirt in progress

With LoopRez Deluxe v0.81, "Edit Linked Parts" can be used to edit a panel of a rezzed skirt in progress; "Touching" the edited panel then propagates the change through the rest of the skirt. For the Commercial Edition, all prim parameter attributes are transfered. However, because of permissions issues, with the Personal Edition, all parameters except texture are transfered. Textures can still be set using the DropScript.

Update with version 0.81: the Skirt Programmer

An in-development "power user" function that is being included in early form with version 0.81, the Skirt Programmer is a tool that allows the use of Notecards to program in smoothly varying skirt panel lengths and color gradients around the circumference of the skirt. This feature may further evolve, and user input for potential new features and uses are always welcome.

Improved panel placement and rotation

Changing the "flare" angle of a skirt (how much it "poofs" outwards) will no longer make the panels embed inside or pull away from the avatar -- it stays nicely anchored at the waistline. This is done performing rotations from the "edge" of a prim skirt panel, rather than from the center.

The previous version of LoopRez would bunch up panels on the "ends" of an ellipse. The more elongated the ellipse was, the more pronounced the effect would be. A new option will insure that panels are placed evenly. This requires simulating some integral calculus in LSL, which is slow and rather memory hungry. This looks better when low "flare" angles are used; letting the panels bunch up on the ends looks better when there is more "flare."

LoopRez Deluxe rezzing the starting panels:

All linked up and ready for modifications:

How will LoopRez Deluxe be distributed?

The original LoopRez script was free and open source, a gift to the SL community. (Yeah, yeah, I know you can see what's coming...) LoopRez Deluxe won't be free. There is a product on the SL market which is being sold at L$5,750. Although few details are publicly available on its features, I suspect that LoopRez Deluxe will compare favorably.

I don't want to charge that much. I would rather that LoopRez Deluxe be available to more people to use and enjoy.

Two versions have been released, both with the same features, as far as functionality goes. Both versions will be COPY / NO TRANSFER, to keep the upgrades simple. All upgrades to both versions will be free.
  • LoopRez Deluxe Personal Edition will create skirts, but the creator name will be stuck as me, and the skirts will be no transfer; i.e., you'll be able to create skirts for yourself, but not give them to others. For personal use only :)
  • LoopRez Deluxe Commercial Edition, has instructions on how to make YOU the creator, and the skirts generated will be full permissions, to distribute as you wish.
I think it would be fair to sell the Personal Edition for L$200, and the Commerical Edition for L$2,000. And if you don't like that, remember there's always the open source free original LoopRez script. I hope this seems fair.

Update: LoopRez Deluxe and the free script are now available at multiple locations.


Finally, feedback is important to me. If there are features you would like to see, and if I'm able to incorporate them, I'd be willing to try. All upgrades will be free.

Helpful Links
There is an open membership "Script Thingies" group now available in Second Life, for product upgrade announcements and support. It is meant to be LOW volume and NO spam.

Again, thanks for your interest, and contact Ged Larsen with any questions!

Acknowledgments: thanks to Strife Onizuka, scripter extraordinaire, for freely providing the code for GetPrimitiveParams(), a function that obtains the primitive parameters for multiple settings at once, and packages it for use in llSetPrimitiveParams. Without this, "morphing" the skirt panels would have been much, much more difficult.

Sunday, January 21, 2007

loopRez, and people's "posteriors", part 2

The good news: after beating my head against the wall sufficiently, LoopRez has been re-coded to have a start at accommodating avatars with more generous posteriors, without causing the glitchy panels originating out of people's lower thighs and whatnot.

The bad news: it seems that properly integrating it with what I've been working on for the past month will require completely re-structuring 3 interacting scripts. [..sigh..] That's shuffling around more than a thousand lines of code (not counting the 500 or so lines of user interface "improvements" I deleted last week because they just didn't work well enough).

But anyhow, here's an exaggerated view of what a dress might look like, if designed for someone who had rather ample lower cushioning. (And no, it doesn't have to be quite so generous -- I just wanted the effect to be obvious.)

This last view is from directly above the center point, so you can see how much more the "back" panels on the left poof outwards.

Essentially, what you can now define is:
  • a baseline adjustable "flare angle" amount of poof that all panels have
  • a separate adjustable "posterior angle" that is only applied in the back part of the skirt
  • potential for tweaking how rapidly the extra "posterior angle" is applied, as you move backwards from the sides of the skirt

As mentioned previously, prims rotate from the center, not from an edge, so the trick was to counteract the tilting inwards of the top of a skirt panel, as the lower part was poofed outwards.

I think a very generous posterior angle could make it very easy to make one of those (and I had to do some serious Google'ing to find this term) Victorian era bustle dresses. (Perhaps I should have asked proper Victorian fashion advice from Miss. Virrginia Tomobola!) Although, if it got extreme enough, the back panels would have to be lengthened, I suppose, to reach the ground, which could also potentially be automated.

Bah. Now to rewriting everything.

Saturday, January 20, 2007

classical music on SL

One of my favorite things in SL is listening to live music performed, all sorts. Favorites so far have been Picker Apogee, Charles Coleman, Lyndon Heart, Keiko Takamura. Most everything really.

But I've always been a bit disappointed never to find any classical music. Until tonight. And oh, what an incredible first exposure!

Catherine Moody played her debut in SL. She is incredibly talented! Some things she played included a liszt etude, chopin prelude, mozart sonata, chopin nocturne, beethoven sonata, schubert sonata, bach prelude, and 2 works of her own composition (one written when she was 7 or 8 years old). and she took requests as well.

I'm really hoping she'll be playing again -- more of the arts on SL would be great.

perhaps it really is time for a make-over

So, SL clothing designer extraordinaire Natalia Zelamanov wrote in her blog today about guys and their usual appearance in SL (bottom line: "Ive mentioned how shabby many guys dress in Second Life"

The 2nd or 3rd picture down in her entry (pretty much close to the "Before" look in her make-over) is a spitting image of me! Argh!

Well, I suppose I'll have to learn some clothing design. I thought I'd start off by trying to recreate some of these outfits.

I even have a color scheme picked out!

Look out SL!

Friday, January 19, 2007

rotations are evil

LSL rotation and quaternion math hurt my brain. Or, more dramatically, directly from the LSL scripting wiki:
"Quaternions are the things that scare all manner of mice and men. They are the things that go bump in the night. They are the reason your math teacher gave you an F. They are all that you have come to fear, and more. Quaternions are your worst nightmare." -- Confuted
Incorporating a proper correction factor for selectively angling out the back panels of a skirt while keeping the waistline smooth is not going too smoothly, primarily because I'm not that good at rotations, and because rotations act from the center of a prim and mess up where the tops of the panels end up.

So much for my initial assessment that "it would be easy"...

A code snippet to stare at. I wrote it, it seems to do something that will be useful, but I'm having trouble combining it with the rest of LoopRez. Essentially, if you toss this script into a box prim, it will appear to be rotating around an EDGE, instead of around the center, without resorting to the usual door-opening script trick of "cutting" the door. You have to combine the rotation with a compensatory position change. It really hurts my brain.

float flareAngle = 30.0;
integer n;
vector rotOrigin( rotation myLocalRot ) {
vector size = llGetScale();
return (llRot2Up(myLocalRot) * size.z / 2.0);
touch_start(integer num) {
for ( n=0; n<12; ++n ) {
rotation desiredRot = llEuler2Rot( < 0.0, flareAngle*DEG_TO_RAD, 0.0 > );
vector rotOriginBefore = rotOrigin( llGetLocalRot() );
rotation newLocalRot = desiredRot * llGetLocalRot();
vector rotOriginAfter = rotOrigin( newLocalRot );
llSetPrimitiveParams([PRIM_POSITION, llGetLocalPos() + rotOriginBefore - rotOriginAfter, PRIM_ROTATION, newLocalRot]);

Oh I've got the lonely skybox, rotational, brain-exploding scripting blues...

Wednesday, January 17, 2007

geodesic domes in second life

Success, the geodesic dome script actually works!

(looks like a Blue Poseball got very angry at me...)

As I mentioned yesterday, the domes start off as a 20-triangle-faced object, an icosohedron. To make it geodesic, you take each triangle, and split it into n^2 smaller triangles, and smooth them out to the surface of a sphere.

So, for increasing values of n, you get more triangles used to form the sphere:
- n=1: 20 triangles (what I had yesterday, an icosahedron)
- n=2: 80 triangles (the one I'm trapped in up above)
- n=4: 320 triangles (the bottom one, but using larger triangles)
- n=6: 720 triangles (shown below)

I wrote it to be fully scalable, so that you could make the spheres / domes as big as you want. I'm not sure how many prims it would take to crash the sim, so I didn't try to make any bigger than 720 triangles, although I know people have made ones in SL with more than 1,000 triangles. Still, with a prim size limit of 10 meters, using 720 triangles would allow you to make a sphere that was >90 meters across, or 360 triangles for a dome, which is more useful for a build anyhow.

Rez in progress, for a 720-prim sphere

All done! Behold, the Blue Poseball of Doom!

This one actually uses fewer (320), but larger triangles, so the completed sphere is larger than the ones above.

OK, this is just about the largest geodesic sphere you can make with 720 triangles (the triangles are nearly maxxed out at 9.8 meters). I can't zoom out far enough to get the whole thing in. Trying to make it bigger started running into problems of encroaching on neighboring sims, so I don't think I'll try to do the 1280-prim sphere.

"That's no moon... It's a... giant blue poseball..."

But, that still leaves the question... What do I do with these things now?

Tuesday, January 16, 2007

hamster's revenge, a first step towards geodesic domes

For no real good reason, I thought it'd be fun to try to write a script to generate geodesic domes. Other people have already successfully used programs outside of SL (Blender), and then imported the coordinates into SL and used scripts to rez the objects there. Seifert Surface has a huge one that houses his sculpture garden.

But it seemed like it'd be an interesting challenge to try to do it fully in SL. First off, though, I had no idea what a geodesic dome _really_ was. Google is a great tool... A bunch of Google'ing, with fun-filled sites like: Geodesic Dome -- from Wolfram MathWorld, and I started to understand it. A potentially useful site is "Desert Domes," which includes calculators if you actually wanted to build one in real life. The calculators will eventually be useful to make sure I stay within the 10m maximum size prim limit.

One common way to generate a geodesic is to start with a icosahedron, which is a 20-sided object composed entirely of twenty identical equilateral triangles. From the center of the icosahedron, ALL vertices lie on the surface of a sphere, so the icosahedron is a decent 20-faced approximation of a sphere.

To make a geodesic sphere, you divide up each triangular face into n^2 identical triangles, and then "push out" the points of those triangles to the surface of the sphere. The bigger 'n' is, the smoother your geodesic dome will be. (And the huger the number of triangles you'll need.)

Back in November, Seifert Surface posted a set of scripts that would generate parametric surfaces in SL. I didn't care about that part, BUT, it included a nice set of functions to rez a triangle if you fed it the corners, which is exactly what I'd need.

I figured, since the basis of a geodesic sphere is an icosahedron, I'd start with trying to rez that. Bizarrely, it worked on my first try.

Here's the rezzer in action:

And if you happen to be sitting on the rezzer while it's doing its work...

...you get your very own hamster ball to run around in!

Loads of fun, if you make it physical, and allow anyone to move it. Let's play "Roll the dorky scripter around"!

Next step towards making geodesic domes will be to subdivide each of the 20 triangles of the icosahedron into n^2 triangles, and "pushing" them out to the surface of a sphere, and then connecting all the new vertices with smaller triangles.

loopRez, and people's "posteriors"

I came across this complaint about flexi-skirts on the SL forums:

Interesting. But a question I have always wanted to ask designers: why do most flexi skirts expose the butt? The flexi always seems to start halfway down the butt or lower. Even editing doesn't seem to fix this. I always guessed it was an SL limitation as there are only few designers who have totally got it right with this IMO...so is there a limitation? Like AV feet and skinners - it's just hard?

Natalia has also mentioned something about this. The reason, I assume, is that the flexi prims are phantom, and hang downwards from the waist. In front, it's OK for them to hang downwards, but in back, the avatar's "posterior" goes outwards from the waist, so the flexi prims drop straight through that part of the AV's body.

I think I've got some ideas on how to tweak this in skirts, and reduce the problem... It should even be pretty easy. Hmmm...

Sunday, January 14, 2007

LSL bloatware, and being antisocial

I feel like I've become a mini-Micro$oft, producing bloatware with unwanted and unnecessary "features". Yes, I ran into my first out-of-memory, stack-heap collision script crash.

The business end of LoopRez does the majority of its work in about 15 lines of code. Yet somehow, over the past month, with who knows how many hours of script twiddling, I now have 3 interacting scripts consisting of >1,200 lines of code.

Oh well. Perhaps the world of SL doesn't really want or need a motion-key capturing, multi-level dialog window using, chat-commanded, calculus-simulating, prim-panel feature duplicating, auto-object linking, floating status text-indicating, real-time interactive skirt generating tool. Time to cut out the useless stuff, and just leave the basics in place.

(Or perhaps, to remove just enough so that it all works again...)

I think that if SL is going to stay fresh and interesting, I'm going to have to get off the 600m in the air platform I've been hanging out on, and get back out into the "normal" SL world to see things, explore places, and meet people. SL can be a lonely place, all by yourself on a platform, and I think it's been getting to me.

Saturday, January 13, 2007

LSL challenges: numerical data entry

LSL is all about compromises. It's powerful and allows you to customize SL in a way I never thought would be available to a "normal user" in a MMORPG-type setting, but it's limited enough that it's challenging to do things I'd often take for granted.

User interface is particularly limited. Not only isn't there a way to do fancy things like drop-down menus, radio buttons, checkboxes, etc., but it's actually not even possible to enter a number in a dedicated text-entry field.

You can get around this by setting up "listens" on particular channels, and entering commands on the chat line, like "\1 flare 45" to set the flare angle to 45 degrees, but I think something much more user-friendly would be to have a llDialog window, click the "Flare" button, and then enter 45.

For number entry, I tried the following to use llDialog and its customizable buttons as a numeric keypad:

integer LISTEN_CHANNEL = 34687;
list NUMBER_PAD = [ "0", "OK", "Cancel", "7", "8", "9", "4", "5", "6", "1", "2", "3" ];
string entry = "";

default {
state_entry() {
llListen(LISTEN_CHANNEL, "", NULL_KEY, "");

touch_start(integer total_number) {
entry = "";
llDialog(llDetectedKey(0), "Entered: "+entry+"_", NUMBER_PAD, LISTEN_CHANNEL);

listen(integer channel, string name, key id, string message) {
if ((channel == LISTEN_CHANNEL) && (llListFindList(NUMBER_PAD, [message]) != -1)) {
if (message == "Cancel") {
entry = "";
llDialog(id, "Entered: "+entry+"_", NUMBER_PAD, LISTEN_CHANNEL);
else if (message == "OK") {
llOwnerSay("The number "+entry+"was entered.");
else {
entry += message;
llDialog(id, "Entered: "+entry+"_", NUMBER_PAD, LISTEN_CHANNEL);
It creates a numeric keypad with the digits 0-9, an "OK" button, and a "Cancel" button. It builds up an entry as you press digits, and then displays the result after you press "OK".

It works, but I learned that llDialog has a built-in delay (1 second, I think), and the constant re-drawing of the dialog window is a little distracting. It could be used, but it's not very elegant.

Johanna Hyacinth suggested hijacking the payment dialog, which allows a free-form integer entry window, but I think people would get suspicious about "paying" L$ just to enter a number, even if the L$ got returned.

An HUD is the fancy option, but for me anyhow, wouldn't be fun to write.

Maybe spoken chat-driven number entry isn't so bad.

(Addendum: this blog style template really doesn't like long lines of code. Anyone know a better way to post code snippets?)

Friday, January 12, 2007

a pleasant surprise!

I woke up to a nice surprise this morning.

Leaving myself logged in and "camping" overnight (a frequent habit, apologies if you IM and I don't respond -- most of the time, the computer crashes at some point and I never even get to see the IM), I peeked at the client and...

...someone had left a thank you note and a tip, for the LoopRez script! It kind of made my day, to know that people have found the script useful.

LoopRez is free for anyone to use, however they wish -- a gift to the SL community. But notes of appreciation are nice too :) (... and the tip sure beats hours and hours of camping! :) )


On an off-note, being de-friended is kind of weird, when you have no idea why it happened. Oh well.

Wednesday, January 10, 2007

musings on generating necklaces

What would it take to write a 'proper' necklace generator in SL?

The script that produced the weird Lissajous object (which Natalia has dubbed the Crazy Prim Thingie) was originally a test case for necklace generation. I never got around to making any further progress, and Johanna Hyacinth has already made huge progress in doing many if not all of the things it takes to have necklaces generated. But if I were to return to this puzzle...

Some musings:
  • the path a necklace takes
    • behind the neck, it could ride high, or dip down a bit
    • depending on how far down it went in back, the path over the shoulders would either need to come UP and then down, or just go straight down
    • in front, there can be a huge range of how far down you might want it to dip
    • if there was a object in front, it should drag the necklace down to form more of a point; if not, the front should be rounded
    • how far outwards the necklace would go, side-to-side, I suppose would be defined by the width of the necklace wearer's neck
  • the composition of a necklace
    • simplest would be a repeating object, like a string of beads
    • an alternating set of objects, like alternating links and objects
    • an arbitrary set or list of items, which may or may not be the same size
  • rotation of the items along the necklace path
    • flat objects should lie against the skin
    • links would rotate, usually 90 degrees with each link
    • rounder objects might be randomly rotated
  • spacing of the objects
    • generally, you would want them to 'just touch', end-to-end
    • the weird Lissajous object was my experiment to make sure that this was doable with an arbitrary 3D-path.
    • this is where computation efficiency would count; doing it in LSL could be rather slow. For the Lissajous object, I did the computation outside of SL. But, I still think it'd be preferable to be able to generate the necklace entirely in SL
And somehow, I think there are probably other factors that I haven't even considered yet...

Altogether, sounds rather challenging. And, I've seen enough people with necklaces floating a bit off the shoulders, or disappearing into the neck, that I wonder whether people in general would even care about having a properly fitted necklace.

Tuesday, January 9, 2007

improving loopRez

I've been working on a significantly enhanced version of the original loopRez script. I hope to optimize it for generating skirts, simplifying the process, and making it more flexible and powerful for adjusting parameters. It'd be very helpful to get feedback from skirt designers who've used the original loopRez skirt regarding suggestions / ideas to make the process easier or more helpful.

The original loopRez script, I've always intended to be freely distributed for everyone to do with as they wish -- a contribution to the SL community. But, camping for L$ gets really boring, so the enhanced version will likely be sold.

Some enhancements already incorporated include:
  • voice commands to change all parameters (so you don't have to go into the script to edit things)
  • changing parameters results in real-time changes to the skirt object (so as you try out different settings, you can _immediately_ see the changes reflected in your skirt)
  • the ability to evenly space the panels around the perimeter of the ellipse (at some speed cost)
  • voice command to change flexi parameters of the panels, on-the-fly, to help find the appropriate flexi settings
  • allowing you to use template objects, and select which shape / color / texture / flex parameters to transfer to your skirt
  • using the loopRez object as a pose stand, so you can adjust the skirt as it is being designed, on your avatar

Ideas, from talking with Sylvia Campbell (TUI) and reading Natalia Zelmanov's tutorial:
  • automatic linking all skirt panels to a centered object, to assist in attachment point adjustments
  • using arrow / movement keys to make adjustments, rather than either going into the script OR typing annoying voice commands
  • using dialog windows and/or HUD interaction to further improve the interface
If people have other ideas / suggestions, I'd really like to hear them. Comment here, or send me a notecard in-world. Sending me IM's in world sometimes doesn't work, because the client frequently crashes while I'm AFK camping, and the IM's get lost.

object spacing around an ellipse

Another example of fixing something that probably nobody cares about, or even noticed. But it bugged me, and elsewhere, Johanna Hyacinth, who makes really nice jewelry, as well.

The problem with spacing things evenly around the perimeter of an ellipse is that it's not as easy mathematically as you'd think. There's not even an exact equation you can plug in to figure out WHAT the distance is around an ellipse, although there are good approximations. Even after you have that, there's no easy way to figure how to get at the evenly spaced spots (i.e., the "theta" in a parametric equation).

So, probably in the same way Johanna Hyacinth did it, I resorted to brute force calculations. (Essentially, it's using LSL to do approximate some integral calculus, which is NOT something I've had to think about for, well, more than a decade.) LSL is not designed to be particularly fast at calculations, so it slows things down a bit.

Does it matter, for example, for making skirts, as described in Natalia Zelmanov's blog? Probably not, because people's waists aren't "stretched" enough for it to be likely to show. But, it makes me feel better to know that I _could_ space the panels evenly, if I wanted to. But, for necklaces, like the ones that Johanna made, it's more important that the segments line up evenly.

Anyhow, below are pictures of loopRez ellipses. In the original version, the objects are not evenly spaced (you can see the objects bunched up at the long ends of the ellipse); in the new version, the objects are spaced a bit better.


Here's an experiment with laying down prim segments in complex 3-dimensional paths, as smoothly as possible, with minimal gaps between segments. Why? I have no idea.

I'm not sure if it has any possible practical use. Shrunk down with tiny tortured prims, this could make a very complex backing as a setting for jewelry, but it'd be rather prim-expensive.

First test case was a 153-prim "thing" made of a 3-dimensionalized curve that I think is a Lissajous curve.

From above, it's moderately simple looking, but from other views, it's kind of cool how the path intertwines. Well, at least I think so.

Incidentally, in order to have the segments touch nicely end-to-end, a serious amount of computation needs to be done. It's basically a monstrous increase over the computation of spacing things evenly around an ellipse. Although it could be done entirely in LSL, I don't want to grow old(er) while it's computing, so I off-loaded the computation to be done outside of SL, and then feed the results into the SL script for rezzing the object.