From cca9fba79f8fad977b16c528c868e34523b515b5 Mon Sep 17 00:00:00 2001 From: Nick Fisher Date: Tue, 4 Mar 2025 18:17:17 +0800 Subject: [PATCH] add setImage method to set texture image directly from buffer --- .../viewer/src/ffi/src/thermion_dart.g.dart | 25 ++++++++++++++++++ .../src/viewer/src/shared_types/texture.dart | 4 +-- thermion_dart/test/texture_tests.dart | 26 ++++++++++++++++++- 3 files changed, 52 insertions(+), 3 deletions(-) diff --git a/thermion_dart/lib/src/viewer/src/ffi/src/thermion_dart.g.dart b/thermion_dart/lib/src/viewer/src/ffi/src/thermion_dart.g.dart index e05b7f21..1f6232b4 100644 --- a/thermion_dart/lib/src/viewer/src/ffi/src/thermion_dart.g.dart +++ b/thermion_dart/lib/src/viewer/src/ffi/src/thermion_dart.g.dart @@ -879,6 +879,31 @@ bool Texture_loadImage( pixelDataType.value, ); +@ffi.Native< + ffi.Bool Function( + ffi.Pointer, + ffi.Pointer, + ffi.Uint32, + ffi.Pointer, + ffi.Size, + ffi.Uint32, + ffi.Uint32, + ffi.Uint32, + ffi.Uint32, + ffi.Uint32)>(isLeaf: true) +external bool Texture_setImage( + ffi.Pointer tEngine, + ffi.Pointer tTexture, + int level, + ffi.Pointer data, + int size, + int width, + int height, + int channels, + int bufferFormat, + int pixelDataType, +); + @ffi.Native< ffi.Pointer Function( ffi.Uint32, ffi.Uint32, ffi.Uint32)>(isLeaf: true) diff --git a/thermion_dart/lib/src/viewer/src/shared_types/texture.dart b/thermion_dart/lib/src/viewer/src/shared_types/texture.dart index 29ef85c4..2d3ebdf8 100644 --- a/thermion_dart/lib/src/viewer/src/shared_types/texture.dart +++ b/thermion_dart/lib/src/viewer/src/shared_types/texture.dart @@ -306,8 +306,8 @@ abstract class Texture { covariant LinearImage image, PixelDataFormat format, PixelDataType type); /// Sets the image data for a 2D texture or a texture level - Future setImage( - int level, Uint8List buffer, PixelDataFormat format, PixelDataType type); + Future setImage(int level, Uint8List buffer, int width, int height, + int channels, PixelDataFormat format, PixelDataType type); /// Sets the image data for a region of a 2D texture Future setSubImage(int level, int xOffset, int yOffset, int width, int height, diff --git a/thermion_dart/test/texture_tests.dart b/thermion_dart/test/texture_tests.dart index 93522223..d45c5076 100644 --- a/thermion_dart/test/texture_tests.dart +++ b/thermion_dart/test/texture_tests.dart @@ -7,7 +7,7 @@ void main() async { final testHelper = TestHelper("material"); group("image", () { - test('decode image', () async { + test('set texture from decoded image', () async { await testHelper.withViewer((viewer) async { var imageData = File("${testHelper.testDir}/assets/cube_texture_512x512.png") @@ -25,6 +25,30 @@ void main() async { await texture.dispose(); }, bg: kRed); }); + + test('setImage', () async { + await testHelper.withViewer((viewer) async { + var imageData = + File("${testHelper.testDir}/assets/cube_texture_512x512.png") + .readAsBytesSync(); + final image = await viewer.decodeImage(imageData); + expect(await image.getChannels(), 4); + expect(await image.getWidth(), 512); + expect(await image.getHeight(), 512); + + final texture = await viewer.createTexture( + await image.getWidth(), await image.getHeight(), + textureFormat: TextureFormat.RGBA32F); + var data = await image.getData(); + + await texture.setImage( + 0, + data.buffer.asUint8List(data.offsetInBytes), + 512, 512, 4, PixelDataFormat.RGBA, PixelDataType.FLOAT + ); + await texture.dispose(); + }, bg: kRed); + }); }); group("sampler", () {