This can be applied to resizable buttons, windows, dialogs, backgrounds, etc. on prim faces so that they don't look stretched and can maintain proportion to look visually pleasing. The advantage of this is that the slices are handled in an internal framebuffer by LL themselves so it can be drawn onto a single face by a scripter without having to use more prims to achieve the same effect. key llSlicedSpriteCreate(integer link, integer face, string texture, list sprites, vector cornerDimensions, vector initialSize) link - The link to hold the sliced sprite. face - The face to draw the sliced sprite on. texture - A texture UUID representing the nine slices. sprites - A list of pixel coordinates (vectors) in the texture of the nine slices. cornerDimensions - The corner dimensions of the slices. initialSize - The initial size of the sliced sprite. integer llSlicedSpriteResize(key spriteKey, vector newSize) The stretchable (edges and center) adjust proportionally while keeping the corners fixed. spriteKey - The id of the sprite returned by llSlicedSpriteCreate newSize - A vector specifying the new overall size for the sprite. returns success integer llSlicedSpriteSetTexture(key spriteKey, string texture, list sprites) In case later on the scripter wants to change the textures or slices. spriteKey - The id of the sprite. texture - The UUID of the new texture. sprites - A list of pixel coordinates in the texture of the nine slices. returns success vector llSlicedSpriteGetSize(key spriteKey) Retrieve the current size of the slice sprite. spriteKey - The id of the sprite. returns the size integer llSlicedSpriteDelete(key spriteKey) In case the scripter wants to release and no longer use the sliced sprite. spriteKey - The id of the sprite. returns success Example usage, creating a 9-sliced sprite that users can resize: key dialogBox; key dialogTexture= "texture"; list dialogSprites = [ TLcoordinate, Tcoordinate, TRcoordinate, Lcoordinate, Ccoordinate, Rcoordinate, BLcoordinate, Bcoordinate, BRcoordinate ]; vector cornerDimensions = <0.5, 0.5, 0.1>; vector initialDialogSize = <4.0, 3.0, 1.0>; vector size1 = <4.0, 3.0, 1.0>; vector size2 = <6.0, 5.0, 1.0>; default { state_entry() { dialogBox = llSlicedSpriteCreate(LINK_THIS, 3, dialogTexture, dialogSprites, cornerDimensions, initialDialogSize); } touch_start(integer n) { vector newSize; vector currentSize = llSlicedSpriteGetSize(dialogBox); if (currentSize.x < 5.0) newSize = size2; else newSize = size1; llSlicedSpriteResize(dialogBox, newSize); } } There are more complex and powerful examples of how to use this but I figured I'd keep the use case simple. I also came up with a TileMap API and Inbetweening for easing in/out 2D sprite motions but I don't want to overwhelm you guys with feature requests. And, also my tilemap API wasn't that great and I think LL might come up with a better one themselves. This combined with my spritesheet and 2D physics suggestions along with the much anticipated Lua scripting will quickly revolutionize the development of 2D sprite games on SL and lead to a lot of interesting new products.