How to obtain the height and width of textures in TCastleScene
Note: I give an answer below, but it will be helpful if you can describe in more detail what do you want to achieve in the end. I.e. why do you want to know texture size, how it’s loaded in TCastleScene. Then we can maybe advise better :), there are maybe more direct ways of doing what you need.
The answer: the Scene has RootNode
which contains a graph of nodes, see Scene graph (X3D) | Castle Game Engine . You can search it for TImageTextureNode
nodes, e.g. using
Scene.RootNode.EnumerateNodes(TImageTextureNode, @MyProc, false);
See e.g. how examples/animations/animate_bones_by_code/
is using EnumerateNodes
. It’s using EnumerateNodes
for different purpose, but the idea remains. See castle-engine/examples/animations/animate_bones_by_code/code/gameviewmain.pas at master · castle-engine/castle-engine · GitHub .
In MyProc
, you get a node, Node: TX3DNode
. You can cast it to TImageTextureNode
and access properties, like this:
procedure TViewMain.MyProc(Node: TX3DNode);
var
TextureNode: TImageTextureNode;
begin
TextureNode := Node as TImageTextureNode; // safe to cast, as EnumerateNodes only chooses TImageTextureNode
// Possible URLs from which to load texture are in TextureNode.FdUrl.Items .
// The URL which was actually used to load the texture, if any, is in TextureNode.TextureUsedFullUrl .
TextureNode.IsTextureLoaded := true; // load the texture now, if not loaded yet
if TextureNode.IsTextureImage then
begin
WritelnLog('loaded from %s', [TextureNode.TextureUsedFullUrl]);
WritelnLog('loaded size %d %d', [TextureNode.TextureImage.Width, TextureNode.TextureImage.Height]);
end else
begin
WritelnLog('not loaded, no valid URLs');
end;
end;
^ I did not actually test the above code, but hopefully it will get you started
The API docs of TImageTextureNode and ancestor classes: