Hello Patrick,
Patrick Perron wrote:
> Hi,
> I have a problem with a texture when I execute my program.
> I’m running VRJuggler 2.0.1 and OpenSG 1.6.0 on an SGI Irix system in a
> CAVE environment.
> Here is what I want to do and what is happening (the source code sample
> will follow):
>
> I want to create a Plane geometry and apply a texture on it. The texture
> will be an animated movie (each frame is an RGB image), so I will change
> the texture each frame displayed (like doing a flip book animation).
>
> The problem I have is when I play all the animation once, it’s OK, but
> the second time, the program crash with this warning “WARNING:
> Window::frameExit: Caught stray OpenGL error invalid operation (0x502)”.
> I did some test and it’s really seems to be related to a texture
> problem. The problem seems to come from the image data either being
> deleted or something like that.
you probably have no other references to the first image and when it is
removed its refcount is decreased and the image deleted.
See below on how to fix that:
> Here is an extract of the code:
[SNIP - some code]
> CScene::CScene()
> {
> GeometryPtr AnimGeo = makePlaneGeo(10,8,1,1);
> tex_01 = SimpleTexturedMaterial::create();
> for(int i=0; i < 10; i++) aImgAnimation[i] = Image::create();
> aImgAnimation[0]->read("frame_01.sgi");
> aImgAnimation[1]->read("frame_02.sgi");
> aImgAnimation[2]->read("frame_03.sgi");
> …
> aImgAnimation[9]->read("frame_10.sgi");
put a loop with this content here:
addRefCP(aImgAnimation[i]);
this increments the ref count of the images (in this case to 1).
> beginEditCP(tex_01);
> tex_01->setImage(aImgAnimation[0]);
> endEditCP(tex_01);
without the addRefCP, aImgAnimation[0] gets a ref count of 1 here, the
other images remain at 0.
> beginEditCP(AnimGeo, Geometry::MaterialFieldMask);
> AnimGeo ->setMaterial(tex_01);
> endEditCP(AnimGeo, Geometry::MaterialFieldMask);
>
> NodePtr Anim_core = Node::create();
> beginEditCP(Anim_core, Node::CoreFieldMask);
> Anim_core->setCore(AnimGeo);
> endEditCP(Anim_core, Node::CoreFieldMask);
> // Master node of all scene already exist…
> beginEditCP(MasterNode);
> MasterNode->addChild(Anim_core);
> endEditCP(MasterNode);
>
> }
>
> void CScene::ChangeAnimation(float fElapsedTime)
> {
> int iFrame = fElapsedTime % 10; // Frame between 0 and 10
> beginEditCP(tex_01);
> tex_01->setImage(aImgAnim[iFrame]);
> tex_01->imageChanged();
> endEditCP(tex_01);
this is where the images are lost without the addRefCP. The image that
is being replaced has its ref count decremented, i.e. it becomes 0 and
therefore the image is deleted.
> }
>
> I did an other test too, I changed the way that ChangeAnimation(float
> fElapsedTime) was running, meaning that I was passing the exact frame
> number I wanted to be displayed… So, what I did is asked the first
> frame, then the third frame and then the second one… every frame worked
> as intended… But if I ask the first one, then the third one and finally
> the first one again… BOOM, the program crash ! I added finally one quick
> checkup, like checking the width of the image before displaying it: when
> asking frame 1, size is ok, the asking frame 3, size ok, asking back
> frame 1, size is now 0…Like if the info of the image have disappeared…
Hope it helps,
Carsten
-------------------------------------------------------------------------
This SF.net email is sponsored by: Microsoft
Defy all challenges. Microsoft(R) Visual Studio 2008.
http://clk.atdmt.com/MRT/go/vse0120000070mrt/direct/01/
_______________________________________________
Opensg-users mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/opensg-users