realbasic-games
[Top] [All Lists]

Re: Animation and memory issue

To: REALbasic Games <realbasic-games at lists dot realsoftware dot com>
Subject: Re: Animation and memory issue
From: Lo Saeteurn <realbasic at miensoftware dot com>
Date: Mon, 25 Jul 2005 16:50:10 -0700
Delivered-to: realbasic-games at lists dot realsoftware dot com
References: <FF3D4383-F5B1-4405-A67F-BDF52954811A at miensoftware dot com> <D52AC133-DDD0-4558-8725-9508D39F6E79 at chaoticbox dot com> <F29BF550-E17D-4DD4-B907-AD971BCB8823 at miensoftware dot com> <8F479F6E-AC0F-4117-8F81-68A68C3A43E1 at chaoticbox dot com> <DE4335D4-957D-49C7-86EC-C6304D6238FA at miensoftware dot com> <DCC3198F-BD3B-405D-B445-072E01D1716A at chaoticbox dot com> <4B8067F5-6CC8-4F99-80CA-74EC961FB1AB at miensoftware dot com> <40DAC1AB-9ADD-4DDF-B37D-C0E885B609D6 at chaoticbox dot com> <EAA7040C-001D-4BB2-8B3B-6DD76F457D1E at miensoftware dot com> <04F31E3F-9A37-4202-BB77-39A17FD6B12F at chaoticbox dot com> <A8E3338F-7E45-46C5-8747-8AB49B8EF210 at miensoftware dot com> <4CEEFD58-497E-4A52-938E-056D9B6C92BA at chaoticbox dot com>
With Quesa you can use Trimesh3D.LockData and Trimesh3D.UnlockData. This won't work on Quickdraw3D however, so it makes sense to keep a copy of the trimesh data locally and calling Trimesh3D.SetData in that case.

Okay, but if the data is from Quesa how do I release it? If I copy the entire trimesh, re-reference all the data back to the original data, then how do I dispose of the copies of the data that Quesa made when creating a copy of the object.

Basically what I'm confused about is: if I use the New Trimesh (existingtrimeshdata) to construct a new trimesh, does it create a copy of everything (points, triangles, edges, etc.) or does it just reference all the items?

Is the object handle pretty much the pointer? If not, how do I get an object handle from this custom trimesh?


Trimesh3D.GetHandle will give you the Quesa object handle if you need it for custom declares.

Okay, but what I meant was what if I create it completely from scratch:

//tmsh is an existing trimesh
dim tmsh as Trimesh3D
dim mem1, mem2 as memoryblock
    mem1=tmsh.GetData
    mem2=NewMemoryBlock(tmsh.kDataSize)
    mem2.StringValue(0,mem2.Size)=mem1.StringValue(0,mem2.Size)
mem2.Ptr(tmsh.kOfsPoints)= NewMemoryBlock(NumberOfPoints*12)// copy the points here


mem2 is the new trimesh and also a memoryblock, how do I add it to a display group? This is assuming that calling "New Trimesh" copies all the data including the points, triangles, etc. If it references these, I should have no problem keeping just the Vertices locally.


If I'm replacing an existing data (such as the vertex array), how do I dispose of it manually?

If you're keeping local memory blocks you'll have to hang on to them as long as Quesa needs them. This could be a little tricky, but if you create some wrapper classes and keep the Trimesh3D with your data it everything will be in sync and just work automatically. A simplified example would be:

AnimatedObject
    .Mesh As Trimesh3D
    .VertexPositions As MemoryBlock
    .TriangleIndices As MemoryBlock
    .TextureUVs As MemoryBlock
    // normals, and any other vertex data...

Clones will have their own VertexPositions blocks and the others will just be pointers to the original's blocks. This'll work even if you trash the original before the clones since RB's reference counting will keep the blocks around until all the clones are destroyed (you can also clone a clone just fine).

Okay I understand this.

Trimesh attribute data is ugly and a pain to work with, but as long as a lump is already there (i.e. the trimesh has UVs, or Normals, etc) then all you have to do is grab the right pointer with GetAttributeDataPtr and assign it to your block. Texture UVs would work something like this:

    Dim uvdataPtr, tmshData As Memoryblock

    tmshData = tmsh.LockData
uvdataPtr = tmsh.GetAttributeDataPtr (tmsh.kAttributeTypeShadingUV, tmsh.kOfsVertexAttributeTypes, tmshData)
    // NOTE: if uvdataPtr is Nil, the mesh doesn't have UVs
    if uvdataPtr <> Nil then uvdataPtr.Ptr(0) = myLocalUVdata
    tmsh.UnlockData

I think that should do it, but I've never tried it myself so there might be some nasty surprises. For example, I'm not sure what Quesa will do with its internal uv data copy...

Okay.

_______________________________________________
Unsubscribe or switch delivery mode:
<http://www.realsoftware.com/support/listmanager/>

Search the archives of this list here:
<http://support.realsoftware.com/listarchives/lists.html>

<Prev in Thread] Current Thread [Next in Thread>