User137:
Thanks for the idea,
i gave it a try, and it just kept coming back with an invalid typcast error.

Robert Kosek:
Thanks again,
I had to make a small adjustment (otherwise i kept getting access violations again)

TVector3fArray = Array [0..0] Of TVector3f;
PVector3fArray = ^TVector3fArray;

I hav'nt properly tested it to see if the values are going in ok, since now i have another problem i completly forgot about, haha.

I have another procedure that sorts the records depending on the puffs distance from the camera, now i know my sort routine is uterly trash, and probably contributes to the most of the lack of speed, however here it is:

[pascal]
procedure TGLVolumetricClouds.SortParticles(Cloud: TVolumetricCloud; mode: Integer);

procedure swap(iFrom,iTo: Integer);
var
tmpPuff: TCloudPuff;
begin
tmpPuff := Cloud.Puffs[iFrom];
Cloud.Puffs[iFrom] := Cloud.Puffs[iTo];
Cloud.Puffs[iTo] := tmpPuff;
end;

procedure sort(Toward: Boolean);
var
i,j: Integer;
tmpPuff: TCloudPuff;
begin
For i := 0 To High(Cloud.Puffs) Do
For j := 0 To High(Cloud.Puffs) Do
Begin
If ((Toward) And (Cloud.Puffs[i].DistanceToCam > Cloud.Puffs[j].DistanceToCam)) Or
((Not Toward) And (Cloud.Puffs[i].DistanceToCam < Cloud.Puffs[j].DistanceToCam)) Then
swap(i, j);
End;
end;

var
done,do_swap,useSTL: Boolean;
i,j: Integer;
begin
done := False;
useSTL := True;

If useSTL Then
Begin
Case mode Of
SORT_AWAY: sort(False);
SORT_TOWARD: sort(True);
End;
End Else
Begin
while (Not done) Do
Begin
done := True;
For i := 0 To High(Cloud.Puffs) Do
For j := i+1 To High(Cloud.Puffs) Do
Begin
do_swap := false;
Case mode Of
SORT_AWAY: do_swap := (Cloud.Puffs[i].DistanceToCam <Cloud> Cloud.Puffs[j].DistanceToCam);
End;

If do_swap Then
Begin
swap(i, j);
done := False;
End;
End;
End;
End;
end;
[/pascal]

Im guessing this would'nt effect the pointers, but i have an assign procedure for the cloud, which needs to copy the pointer, now im assuming if i just did Cloud.vBuffer := Source.vBuffer; that if i make changes this will effect both clouds. would it be best to clear and recreate the pointer (cloud.vBuffer) and then copy the memory (somehow)?

Many Thanks
Nic