add setImage method to set texture image directly from buffer

This commit is contained in:
Nick Fisher
2025-03-04 18:17:17 +08:00
parent a245cf2915
commit cca9fba79f
3 changed files with 52 additions and 3 deletions

View File

@@ -879,6 +879,31 @@ bool Texture_loadImage(
pixelDataType.value,
);
@ffi.Native<
ffi.Bool Function(
ffi.Pointer<TEngine>,
ffi.Pointer<TTexture>,
ffi.Uint32,
ffi.Pointer<ffi.Uint8>,
ffi.Size,
ffi.Uint32,
ffi.Uint32,
ffi.Uint32,
ffi.Uint32,
ffi.Uint32)>(isLeaf: true)
external bool Texture_setImage(
ffi.Pointer<TEngine> tEngine,
ffi.Pointer<TTexture> tTexture,
int level,
ffi.Pointer<ffi.Uint8> data,
int size,
int width,
int height,
int channels,
int bufferFormat,
int pixelDataType,
);
@ffi.Native<
ffi.Pointer<TLinearImage> Function(
ffi.Uint32, ffi.Uint32, ffi.Uint32)>(isLeaf: true)

View File

@@ -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,

View File

@@ -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", () {