From 2019ca1f700c305369ddebc397c68f2bfcf50774 Mon Sep 17 00:00:00 2001 From: Jakob Progsch Date: Wed, 25 Jan 2023 17:25:08 +0100 Subject: [PATCH] Expand attributes scene to test different samplers and their parameters --- libs/anari_test_scenes/scenes/attributes.cpp | 285 ++++++++++++++++++- 1 file changed, 276 insertions(+), 9 deletions(-) diff --git a/libs/anari_test_scenes/scenes/attributes.cpp b/libs/anari_test_scenes/scenes/attributes.cpp index bc3d02f5..295446e0 100644 --- a/libs/anari_test_scenes/scenes/attributes.cpp +++ b/libs/anari_test_scenes/scenes/attributes.cpp @@ -6,6 +6,7 @@ #include "glm/ext/matrix_transform.hpp" #include #include +#include namespace anari { namespace scenes { @@ -15,6 +16,7 @@ static float vertices[] = { 1.f, -1.f, 0.f, -1.f, -1.f, 0.f, -1.f, 1.f, 0.f, + 0.f, 0.f, 0.f, }; static float uv[] = { @@ -22,11 +24,14 @@ static float uv[] = { 1.f, 0.f, 0.f, 0.f, 0.f, 1.f, + 0.5f, 0.5f, }; static uint32_t indices[] = { - 0, 1, 2, - 0, 2, 3, + 0, 1, 4, + 1, 2, 4, + 2, 3, 4, + 3, 0, 4, }; static float colors4f[] = { @@ -34,6 +39,8 @@ static float colors4f[] = { 0.f, 1.f, 0.f, 1.f, 0.f, 0.f, 1.f, 1.f, 1.f, 1.f, 1.f, 1.f, + 0.5f, 0.5f, 0.5f, 1.f, + }; static float colors3f[] = { @@ -41,6 +48,7 @@ static float colors3f[] = { 0.f, 1.f, 0.f, 0.f, 0.f, 1.f, 1.f, 1.f, 1.f, + 0.5f, 0.5f, 0.5f, }; @@ -49,6 +57,7 @@ static float colors2f[] = { 0.f, 1.f, 0.f, 0.f, 1.f, 1.f, + 0.5f, 0.5f, }; static float colors1f[] = { @@ -56,6 +65,7 @@ static float colors1f[] = { 0.f, 0.f, 1.f, + 0.5f, }; static uint32_t colors4u[] = { @@ -63,6 +73,7 @@ static uint32_t colors4u[] = { UINT32_C(0), UINT32_MAX, UINT32_C(0), UINT32_MAX, UINT32_C(0), UINT32_C(0), UINT32_MAX, UINT32_MAX, UINT32_MAX, UINT32_MAX, UINT32_MAX, UINT32_MAX, + UINT32_MAX/2u, UINT32_MAX/2u, UINT32_MAX/2u, UINT32_MAX, }; static uint32_t colors3u[] = { @@ -70,6 +81,7 @@ static uint32_t colors3u[] = { UINT32_C(0), UINT32_MAX, UINT32_C(0), UINT32_C(0), UINT32_C(0), UINT32_MAX, UINT32_MAX, UINT32_MAX, UINT32_MAX, + UINT32_MAX/2u, UINT32_MAX/2u, UINT32_MAX/2u, }; @@ -78,6 +90,7 @@ static uint32_t colors2u[] = { UINT32_C(0), UINT32_MAX, UINT32_C(0), UINT32_C(0), UINT32_MAX, UINT32_MAX, + UINT32_MAX/2u, UINT32_MAX/2u, }; static uint32_t colors1u[] = { @@ -85,6 +98,7 @@ static uint32_t colors1u[] = { UINT32_C(0), UINT32_C(0), UINT32_MAX, + UINT32_MAX/2u, }; static uint16_t colors4us[] = { @@ -92,6 +106,7 @@ static uint16_t colors4us[] = { UINT16_C(0), UINT16_MAX, UINT16_C(0), UINT16_MAX, UINT16_C(0), UINT16_C(0), UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, + UINT16_MAX/2u, UINT16_MAX/2u, UINT16_MAX/2u, UINT16_MAX, }; static uint16_t colors3us[] = { @@ -99,6 +114,7 @@ static uint16_t colors3us[] = { UINT16_C(0), UINT16_MAX, UINT16_C(0), UINT16_C(0), UINT16_C(0), UINT16_MAX, UINT16_MAX, UINT16_MAX, UINT16_MAX, + UINT16_MAX/2u, UINT16_MAX/2u, UINT16_MAX/2u, }; @@ -107,6 +123,7 @@ static uint16_t colors2us[] = { UINT16_C(0), UINT16_MAX, UINT16_C(0), UINT16_C(0), UINT16_MAX, UINT16_MAX, + UINT16_MAX/2u, UINT16_MAX/2u, }; static uint16_t colors1us[] = { @@ -114,6 +131,7 @@ static uint16_t colors1us[] = { UINT16_C(0), UINT16_C(0), UINT16_MAX, + UINT16_MAX/2u, }; static uint8_t colors4ub[] = { @@ -121,6 +139,7 @@ static uint8_t colors4ub[] = { UINT8_C(0), UINT8_MAX, UINT8_C(0), UINT8_MAX, UINT8_C(0), UINT8_C(0), UINT8_MAX, UINT8_MAX, UINT8_MAX, UINT8_MAX, UINT8_MAX, UINT8_MAX, + UINT8_MAX/2u, UINT8_MAX/2u, UINT8_MAX/2u, UINT8_MAX, }; static uint8_t colors3ub[] = { @@ -128,6 +147,7 @@ static uint8_t colors3ub[] = { UINT8_C(0), UINT8_MAX, UINT8_C(0), UINT8_C(0), UINT8_C(0), UINT8_MAX, UINT8_MAX, UINT8_MAX, UINT8_MAX, + UINT8_MAX/2u, UINT8_MAX/2u, UINT8_MAX/2u, }; @@ -136,6 +156,7 @@ static uint8_t colors2ub[] = { UINT8_C(0), UINT8_MAX, UINT8_C(0), UINT8_C(0), UINT8_MAX, UINT8_MAX, + UINT8_MAX/2u, UINT8_MAX/2u, }; static uint8_t colors1ub[] = { @@ -143,6 +164,7 @@ static uint8_t colors1ub[] = { UINT8_C(0), UINT8_C(0), UINT8_MAX, + UINT8_MAX/2u, }; void *arrays[] = { @@ -241,12 +263,146 @@ ANARIMaterial setupTexturedMaterial(ANARIDevice d, return material; } +ANARIMaterial setupSamplerMaterial2D(ANARIDevice d, ANARIArray2D array2d, + float *inTransform, float *outTransform, + const char *filter, const char *wrapMode1, const char *wrapMode2) +{ + ANARISampler sampler = anariNewSampler(d, "image2D"); + anari::setParameter(d, sampler, "image", array2d); + anari::setParameter(d, sampler, "inAttribute", "attribute0"); + + if(inTransform) { + anari::setParameter(d, sampler, "inTransform", ANARI_FLOAT32_MAT4, inTransform); + } + if(outTransform) { + anari::setParameter(d, sampler, "outTransform", ANARI_FLOAT32_MAT4, outTransform); + } + if(filter) { + anari::setParameter(d, sampler, "filter", filter); + } + if(wrapMode1) { + anari::setParameter(d, sampler, "wrapMode1", wrapMode1); + } + if(wrapMode2) { + anari::setParameter(d, sampler, "wrapMode2", wrapMode2); + } + + anari::commitParameters(d, sampler); + + auto material = anari::newObject(d, "matte"); + anari::setAndReleaseParameter(d, material, "color", sampler); + anari::commitParameters(d, material); + + return material; +} + +ANARIMaterial setupSamplerMaterial1D(ANARIDevice d, ANARIArray1D array1d, + float *inTransform, float *outTransform, + const char *filter, const char *wrapMode1) +{ + ANARISampler sampler = anariNewSampler(d, "image1D"); + anari::setParameter(d, sampler, "image", array1d); + anari::setParameter(d, sampler, "inAttribute", "attribute0"); + + if(inTransform) { + anari::setParameter(d, sampler, "inTransform", ANARI_FLOAT32_MAT4, inTransform); + } + if(outTransform) { + anari::setParameter(d, sampler, "outTransform", ANARI_FLOAT32_MAT4, outTransform); + } + if(filter) { + anari::setParameter(d, sampler, "filter", filter); + } + if(wrapMode1) { + anari::setParameter(d, sampler, "wrapMode1", wrapMode1); + } + + anari::commitParameters(d, sampler); + + auto material = anari::newObject(d, "matte"); + anari::setAndReleaseParameter(d, material, "color", sampler); + anari::commitParameters(d, material); + + return material; +} + +ANARIMaterial setupSamplerMaterial3D(ANARIDevice d, ANARIArray3D array3d, + float *inTransform, float *outTransform, + const char *filter, const char *wrapMode1, const char *wrapMode2, const char *wrapMode3) +{ + ANARISampler sampler = anariNewSampler(d, "image3D"); + anari::setParameter(d, sampler, "image", array3d); + anari::setParameter(d, sampler, "inAttribute", "attribute0"); + + if(inTransform) { + anari::setParameter(d, sampler, "inTransform", ANARI_FLOAT32_MAT4, inTransform); + } + if(outTransform) { + anari::setParameter(d, sampler, "outTransform", ANARI_FLOAT32_MAT4, outTransform); + } + if(filter) { + anari::setParameter(d, sampler, "filter", filter); + } + if(wrapMode1) { + anari::setParameter(d, sampler, "wrapMode1", wrapMode1); + } + if(wrapMode2) { + anari::setParameter(d, sampler, "wrapMode2", wrapMode1); + } + if(wrapMode3) { + anari::setParameter(d, sampler, "wrapMode3", wrapMode1); + } + + anari::commitParameters(d, sampler); + + auto material = anari::newObject(d, "matte"); + anari::setAndReleaseParameter(d, material, "color", sampler); + anari::commitParameters(d, material); + + return material; +} + +ANARIMaterial setupSamplerTransform(ANARIDevice d, + float *transform) +{ + ANARISampler sampler = anariNewSampler(d, "transform"); + anari::setParameter(d, sampler, "inAttribute", "attribute0"); + + if(transform) { + anari::setParameter(d, sampler, "transform", ANARI_FLOAT32_MAT4, transform); + } + + anari::commitParameters(d, sampler); + + auto material = anari::newObject(d, "matte"); + anari::setAndReleaseParameter(d, material, "color", sampler); + anari::commitParameters(d, material); + + return material; +} + +ANARIMaterial setupSamplerPrimitive(ANARIDevice d, ANARIArray1D array1d, uint64_t offset) +{ + ANARISampler sampler = anariNewSampler(d, "primitive"); + anari::setParameter(d, sampler, "array", array1d); + anari::setParameter(d, sampler, "offset", offset); + + anari::commitParameters(d, sampler); + + auto material = anari::newObject(d, "matte"); + anari::setAndReleaseParameter(d, material, "color", sampler); + anari::commitParameters(d, material); + + return material; +} + + void Attributes::commit() { auto d = m_device; - auto vertexArray = anariNewArray1D(d, vertices, 0, 0, ANARI_FLOAT32_VEC3, 4); - auto indexArray = anariNewArray1D(d, indices, 0, 0, ANARI_UINT32_VEC3, 2); + auto vertexArray = anariNewArray1D(d, vertices, 0, 0, ANARI_FLOAT32_VEC3, 5); + auto indexArray = anariNewArray1D(d, indices, 0, 0, ANARI_UINT32_VEC3, 4); ANARIGeometry geometries[64] = { }; for(int i = 0;i<16;++i) { @@ -256,7 +412,7 @@ void Attributes::commit() anari::setAndReleaseParameter(d, geometries[i], "primitive.color", - anariNewArray1D(d, arrays[i], 0, 0, types[i], 2)); + anariNewArray1D(d, arrays[i], 0, 0, types[i], 4)); anari::commitParameters(d, geometries[i]); } @@ -267,7 +423,7 @@ void Attributes::commit() anari::setAndReleaseParameter(d, geometries[i+16], "vertex.color", - anariNewArray1D(d, arrays[i], 0, 0, types[i], 4)); + anariNewArray1D(d, arrays[i], 0, 0, types[i], 5)); anari::commitParameters(d, geometries[i+16]); } @@ -282,10 +438,10 @@ void Attributes::commit() anari::setAndReleaseParameter(d, textured, "vertex.attribute0", - anariNewArray1D(d, uv, 0, 0, ANARI_FLOAT32_VEC2, 4)); + anariNewArray1D(d, uv, 0, 0, ANARI_FLOAT32_VEC2, 5)); anari::commitParameters(d, textured); - ANARIMaterial materials[16]; + ANARIMaterial materials[32] = { }; materials[0] = setupTexturedMaterial(d, 32, 32, 4, ANARI_FLOAT32_VEC4, "attribute0"); materials[1] = setupTexturedMaterial(d, 32, 32, 3, ANARI_FLOAT32_VEC3, "attribute0"); materials[2] = setupTexturedMaterial(d, 32, 32, 2, ANARI_FLOAT32_VEC2, "attribute0"); @@ -307,6 +463,113 @@ void Attributes::commit() materials[15] = setupTexturedMaterial(d, 32, 32, 1, ANARI_UFIXED8, "attribute0"); + int N = 32; + Picture p(N, N, 4); + fill_texture(p); + ANARIArray2D array2d = anariNewArray2D(d, p.data.data(), 0, 0, ANARI_UFIXED8_VEC4, N, N); + + std::vector data3d(4*N*N*N); + for(uint64_t z = 0;z data1d(4*N); + for(uint64_t i = 0;i instances; for(int i = 0;i<32;++i) { @@ -342,7 +605,10 @@ void Attributes::commit() } - for(int i = 0;i<16;++i) { + for(int i = 0;i<32;++i) { + if(!materials[i]) { + continue; + } int x = i%4; int y = i/4; @@ -375,6 +641,7 @@ void Attributes::commit() } + for(auto g : geometries) { anari::release(d, g); }