Horde3D
http://horde3d.org/forums/

Updating a texture ressource
http://horde3d.org/forums/viewtopic.php?f=2&t=1611
Page 1 of 1

Author:  rand [ 21.12.2011, 01:49 ]
Post subject:  Updating a texture ressource

I want to make this happen with Horde3D. In essence it boils down to writing data to a texture while it is assigned to a model. But how? Awesomium includes examples that work like this:
Code:
      const Awesomium::RenderBuffer* buffer =
      myobject->webView->render();
      
      memcpy(myobject->buffer, buffer->buffer, myobject->width * myobject->height * 4);
      
      glBindTexture(GL_TEXTURE_2D, myobject->textureID);
      glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, myobject->width, myobject->height,
                  myobject->bpp == 3 ? GL_RGB : GL_BGRA, GL_UNSIGNED_BYTE,
                  myobject->buffer);
Pretty straightforward in OpenGL. But how would I do this operation with Horde3D? I am stuck implementing this because of a lack of reading material. ;) Here are my ideas, but I have no idea if they go in the right direction at all:
    A) Create a h3dUpdateResource() that does: h3dUnloadResource(); create a new h3dRes from a buffer; h3dLoadResource() with the same name. Isn't this slow?
    B) Use the h3dMapResStream() stuff? I couldn't find any examples for this.
    C) It doesn't work like that at all because.

Any guidance is appreciated.

Semi-unrelated extra question: In an older thread I read that it is slow to switch between normal OpenGL and Horde3D to draw a GUI on top of Horde3D. Does that still apply, or has that changed with h3dutReleaseOpenGL() (and does this still only work with Windows?)?

Author:  Volker [ 21.12.2011, 10:38 ]
Post subject:  Re: Updating a texture ressource

Based on this and this wiki entry the following simple code example shows how to change the knight's albedo map to a red texture:

Code:
   
   H3DRes texRes = h3dCreateTexture( "myTexRes", 64, 64, H3DFormats::TEX_RGBA16F, H3DResFlags::NoTexMipmaps );
   float *data = static_cast<float*>( h3dMapResStream( texRes, H3DTexRes::ImageElem, 0, H3DTexRes::ImgPixelStream, false, true ) );
   for( int row=0; row<64; ++row )
   {
      float *rowPtr = data + row*64*4;
      for( int col=0; col<64; ++col )
      {
         float *sample = rowPtr + col*4;
         sample[0] = 1.0f; // R
         sample[1] = 0.0f; // G
         sample[2] = 0.0f; // B
         sample[3] = 1.0f; // A
      }
   }
   h3dUnmapResStream( texRes );   
   H3DNode knightMatRes = h3dFindResource( H3DResTypes::Material, "models/knight/knight.material.xml" );
   h3dSetResParamI( knightMatRes, H3DMatRes::SamplerElem, 0, H3DMatRes::SampTexResI, texRes );


Shouldn't be to difficult to adjust it to your needs. Take note, that updating a res stream does not allow you to change the texture's parameters. So if you want to upload a new texture with different size or type you have to unload the previous texture resource first.

There's also a flash integration to Horde made by jimbo available here

Author:  rand [ 21.12.2011, 12:47 ]
Post subject:  Re: Updating a texture ressource

I love you. Thanks!

Author:  rand [ 03.01.2012, 02:23 ]
Post subject:  Re: Updating a texture ressource

The basics work fine with Horde3D thanks to your help, but I hit a snag on this. I want to dynamically resize the texture I use for Awesomium.

Here is how I think it should work, but doesn't:
Code:
    H3DRes _awsmTextureRes = -1;
    int w = 512;
    int h = 512;

    // Allocate the texture for awesomium
    _awsmTextureRes = h3dCreateTexture("$GuiTexture",
                                    w,h,
                                    H3DFormats::TEX_BGRA8,
                                    H3DResFlags::NoTexMipmaps
                                    );
    // _awsmTextureRes==9 (works perfectly)

    // Deallocate the texture (This must be where I make a mistake)
    int references = h3dRemoveResource(_awsmTextureRes); // returns 0
    h3dUnloadResource(_awsmTextureRes);
    h3dReleaseUnusedResources();
    _awsmTextureRes=-1;

    // Allocate the texture again with half the size in this example (size doesn't matter here)
    _awsmTextureRes = h3dCreateTexture("$GuiTexture",
                                    w/2,h,
                                    H3DFormats::TEX_BGRA8,
                                    H3DResFlags::NoTexMipmaps
                                    );
    // _awsmTextureRes==0 Meaning failure. Why?


What is wrong?

Author:  Volker [ 05.01.2012, 11:11 ]
Post subject:  Re: Updating a texture ressource

I just pasted your code into the knight's app.cpp and it does work without problems. The new texture resource ID was equal to the previous one and not 0 ( because no other resource was added between the calls the ID is equal).
By the way, the call of h3dReleaseUnusedResource() does an unload of the resource anyway so a separate h3dUnloadResource call is not necessary.
The reason why h3dCreateTexture returns 0 probably is that another resource with the same name already exists (forgot to call h3dReleaseUnusedResources after removing the resource?). That error should be written into the log, so if you check the log messages, you may find the reason for the error.

Author:  rand [ 06.01.2012, 00:39 ]
Post subject:  Re: Updating a texture ressource

Thank you again. I generated my material ("$GuiMaterial") using the texture ("$GuiTexture") procedurally like this:

Code:
    _awsmMaterial = __hordeHandler.CreateMaterial("$GuiMaterial",
                                                  "<Material>"
                                                  "<Shader source=\"base/shaders/overlay.shader\"/>"
                                                  "<Sampler name=\"albedoMap\" map=\"$GuiTexture\" />"
                                                  "</Material>"
                                                  );


And apparently that reference to "$GuiTexture" is enough to make it impossible to remove "$GuiTexture". I didn't expect that. I fixed it now with that knowledge.

Page 1 of 1 All times are UTC + 1 hour
Powered by phpBB® Forum Software © phpBB Group
https://www.phpbb.com/