Thank you for your feedback.

1st: all my libs have a version date in the header so you always know which one is newest. Unfortunatly i forgot to add that header in the start post.

But in this Thread was a very old version and you always find the newest version on my website (its easier to maintain than several threads). I update 1st post.
2nd: you found something strange there. It did work with the earlier V11 beta that i used to create it. But i seems that its not allowed to do it that way in V10 and the current V11 beta. Strange, but easy to fix, just get new version. Btw. if you dont need gl.gbas, dont use it, my INLINE is a tiny bit faster - and it compiles faster too.

3rd: Scale factor is differently calculated from the original X_SPRITE one, which is why you dont get particles in the same size without tweaking scale#.
X_SPRITE: scale=1 is based on texture size (and screen resolution?), so if you decide to use a higher resolution texture your sprite gets bigger!
my replacement: scale=1 is always 1 unit in 3D world, no matter what texture size you've got. In my opinion this is more useful and more logical. Just call it with the absolute size that you want your particle to be.
4th: when i use the test program from 1st post i can not confirm your problem. Scale ->see 3rd and rotation works perfectly for me. Btw. you need to keep in mind that you dont tell the sprite to turn/rotate, you call it with the absolute rotation that you want! So if you call it one time with 30 and next time with 30 again it will be stucked at 30°! If you want to turn it you need to do this manuall, like: call it with 30 1st time and with 60 next time, so you get a rotation.
Just for you the test program from 1st post, but with rotation:
// --------------------------------- //
// Project: TSprite
// Start: Sunday, July 24, 2011
// Autor: Kanonet
// Last Update: November 17, 2012
SETSCREEN 800,600,0
SYSTEMPOINTER TRUE
ALLOWESCAPE FALSE
AUTOPAUSE FALSE
LIMITFPS -1
// number of sprites to draw:
LOCAL count%=1000
LOCAL root%=SQR(count)/2, line%, row%, fps, timer, mx, my=15, mz=-4, selected%=1, rot%
// texture
DRAWRECT 0,0, 16, 16, RGB(0,0,255)
DRAWRECT 12,0, 4,8, RGB(255,127,0)
DRAWRECT 0,12, 4,4, RGB(255,0,63)
DRAWLINE 0,0, 16,16, 0xffffff
DRAWLINE 0,16, 16,0, 0xffffff
GRABSPRITE 0, 0,0, 16,16
// sprite
LOCAL sprite AS TSprite
sprite.Init()
// mainloop
REPEAT
line=-root; row=-root; INC rot
// mouse for camera control:
mx = mx + MOUSEAXIS(0)
my = my + MOUSEAXIS(1)
mz = mz + MOUSEAXIS(2)
IF KEY(27) // + more sprites
INC count
root=SQR(count)/2
ENDIF
IF KEY(53) AND count>1 // - less sprites
DEC count
root=SQR(count)/2
ENDIF
IF KEY(2) THEN selected=1
IF KEY(3) THEN selected=2
IF KEY(4) THEN selected=3
X_MAKE3D 0.1, 1000, 45
X_CAMERA my*COS(mx)*root*0.2,mz*2,my*SIN(mx)*root*0.2, 0,0,0
IF selected=1
FOR i=1 TO count
X_SPRITE 0, 0, line, row, 0.06
INC row
IF row>root
row=-root
INC line
ENDIF
NEXT
ELSEIF selected=2
sprite.Start()
FOR i=1 TO count
X_SETTEXTURE 0, -1
sprite.Draw(0, line, row, 0.5, rot)
INC row
IF row>root
row=-root
INC line
ENDIF
NEXT
sprite.Stop()
ELSE
sprite.Start()
X_SETTEXTURE 0, -1
FOR i=1 TO count
sprite.Draw(0, line, row, 0.5, rot)
INC row
IF row>root
row=-root
INC line
ENDIF
NEXT
sprite.Stop()
ENDIF
X_MAKE2D
ALPHAMODE 0.9
DRAWRECT 0,0,800,60,RGB(70,70,70)
PRINT "CAMERA CONTROL: MOVE MOUSE / MOUSE WHEEL | FPS: "+INTEGER(1000/(timer-fps)), 0,0
PRINT "SPRITES CURRENTLY: "+count+" | PRESS (+) FOR MORE SPRITES AND (-) FOR LESS", 0,15
PRINT "SELECT: (1) X_SPRITE | (2) TSPRITE | (3) TSPRITE WITH TEXTURE ORDERING", 0, 30
PRINT "SELECTED: "+selected, 0, 45
SHOWSCREEN
fps=timer
timer=GETTIMERALL()
UNTIL KEY(1)
END
Or more in general: they do not move/ rotate/ scale, you call them with the absolute position, rotation, scaling. If you want to move it,you need to do this in your engine and just call the sprite with absolute positions, same like you do with XSPRITE.

5th: If you just draw the sprites in one function you can keep sprite local. But if you call it in different functions you need to make it global, or create a local sprite type for each function. You need to try for your self whats faster in your case. Btw. if you really want to speed up things, you need to use texture ordering (or just one texture atlas for all particles), X_SETTEXTURE is slow, so try to use it as few as possible. If you use an texture atlas with all particles in one sprite you save much speed. I can write you a function to change texture coordinates like with POLYVECTOR in 2D, this is faster that X_SETTEXTURE, but if you still sort your particles to avoid unnecessary function calls it would be even faster, obviously.
Hope this helps you.
