From 2f35f261487f2442bb8104576f695a469c385359 Mon Sep 17 00:00:00 2001 From: Philip Rideout Date: Wed, 16 Jan 2019 14:52:22 -0800 Subject: [PATCH] VertexBuffer builder normalized now accepts "false". --- .../src/main/cpp/VertexBuffer.cpp | 4 ++-- .../google/android/filament/VertexBuffer.java | 11 +++++++++-- .../google/android/filament/ibl/MeshLoader.kt | 13 ++++--------- .../android/filament/textured/MeshLoader.kt | 13 ++++--------- filament/include/filament/VertexBuffer.h | 2 +- filament/src/VertexBuffer.cpp | 9 +++++++-- libs/filameshio/src/MeshReader.cpp | 16 ++++++---------- tools/filamesh/README.md | 17 +++++++---------- web/filament-js/filament.d.ts | 1 + web/filament-js/jsbindings.cpp | 3 +++ 10 files changed, 44 insertions(+), 45 deletions(-) diff --git a/android/filament-android/src/main/cpp/VertexBuffer.cpp b/android/filament-android/src/main/cpp/VertexBuffer.cpp index ff41f78d31..be8f68dc53 100644 --- a/android/filament-android/src/main/cpp/VertexBuffer.cpp +++ b/android/filament-android/src/main/cpp/VertexBuffer.cpp @@ -65,9 +65,9 @@ Java_com_google_android_filament_VertexBuffer_nBuilderAttribute(JNIEnv *env, jcl extern "C" JNIEXPORT void JNICALL Java_com_google_android_filament_VertexBuffer_nBuilderNormalized(JNIEnv *env, jclass type, - jlong nativeBuilder, jint attribute) { + jlong nativeBuilder, jint attribute, jboolean normalized) { VertexBuffer::Builder* builder = (VertexBuffer::Builder *) nativeBuilder; - builder->normalized((VertexAttribute) attribute); + builder->normalized((VertexAttribute) attribute, normalized); } extern "C" JNIEXPORT jlong JNICALL diff --git a/android/filament-android/src/main/java/com/google/android/filament/VertexBuffer.java b/android/filament-android/src/main/java/com/google/android/filament/VertexBuffer.java index a8b1542bab..0e1f1ee653 100644 --- a/android/filament-android/src/main/java/com/google/android/filament/VertexBuffer.java +++ b/android/filament-android/src/main/java/com/google/android/filament/VertexBuffer.java @@ -108,7 +108,13 @@ public class VertexBuffer { @NonNull public Builder normalized(@NonNull VertexAttribute attribute) { - nBuilderNormalized(mNativeBuilder, attribute.ordinal()); + nBuilderNormalized(mNativeBuilder, attribute.ordinal(), true); + return this; + } + + @NonNull + public Builder normalized(@NonNull VertexAttribute attribute, boolean enabled) { + nBuilderNormalized(mNativeBuilder, attribute.ordinal(), enabled); return this; } @@ -183,7 +189,8 @@ public class VertexBuffer { private static native void nBuilderBufferCount(long nativeBuilder, int bufferCount); private static native void nBuilderAttribute(long nativeBuilder, int attribute, int bufferIndex, int attributeType, int byteOffset, int byteStride); - private static native void nBuilderNormalized(long nativeBuilder, int attribute); + private static native void nBuilderNormalized(long nativeBuilder, int attribute, + boolean normalized); private static native long nBuilderBuild(long nativeBuilder, long nativeEngine); private static native int nGetVertexCount(long nativeVertexBuffer); diff --git a/android/samples/image-based-lighting/app/src/main/java/com/google/android/filament/ibl/MeshLoader.kt b/android/samples/image-based-lighting/app/src/main/java/com/google/android/filament/ibl/MeshLoader.kt index 165bc2b9ac..a12673bf43 100644 --- a/android/samples/image-based-lighting/app/src/main/java/com/google/android/filament/ibl/MeshLoader.kt +++ b/android/samples/image-based-lighting/app/src/main/java/com/google/android/filament/ibl/MeshLoader.kt @@ -218,19 +218,14 @@ private fun createVertexBuffer(engine: Engine, header: Header, data: ByteBuffer) // the range they span. When stored as half-float, there is only enough precision for // sub-pixel addressing in textures that are <= 1024x1024 .attribute(UV0, 0, uvType, header.uv0Offset.toInt(), header.uv0Stride.toInt()) - - // When UV coordinates are stored as 16-bit integers we must normalize them (we want values - // in the range -1..1) - if (uvNormalized(header)) { - vertexBufferBuilder.normalized(UV0) - } + // When UV coordinates are stored as 16-bit integers we must normalize them (we want + // values in the range -1..1) + .normalized(UV0, uvNormalized(header)) if (header.uv1Offset != MAX_UINT32 && header.uv1Stride != MAX_UINT32) { vertexBufferBuilder .attribute(UV1, 0, uvType, header.uv1Offset.toInt(), header.uv1Stride.toInt()) - if (uvNormalized(header)) { - vertexBufferBuilder.normalized(UV1) - } + .normalized(UV1, uvNormalized(header)) } return vertexBufferBuilder.build(engine).apply { setBufferAt(engine, 0, data) } diff --git a/android/samples/textured-object/app/src/main/java/com/google/android/filament/textured/MeshLoader.kt b/android/samples/textured-object/app/src/main/java/com/google/android/filament/textured/MeshLoader.kt index e412179c78..c3bacf6f19 100644 --- a/android/samples/textured-object/app/src/main/java/com/google/android/filament/textured/MeshLoader.kt +++ b/android/samples/textured-object/app/src/main/java/com/google/android/filament/textured/MeshLoader.kt @@ -218,19 +218,14 @@ private fun createVertexBuffer(engine: Engine, header: Header, data: ByteBuffer) // the range they span. When stored as half-float, there is only enough precision for // sub-pixel addressing in textures that are <= 1024x1024 .attribute(UV0, 0, uvType, header.uv0Offset.toInt(), header.uv0Stride.toInt()) - - // When UV coordinates are stored as 16-bit integeres we must normalize them (we want values - // in the range -1..1) - if (uvNormalized(header)) { - vertexBufferBuilder.normalized(UV0) - } + // When UV coordinates are stored as 16-bit integers we must normalize them (we want + // values in the range -1..1) + .normalized(UV0, uvNormalized(header)) if (header.uv1Offset != MAX_UINT32 && header.uv1Stride != MAX_UINT32) { vertexBufferBuilder .attribute(UV1, 0, uvType, header.uv1Offset.toInt(), header.uv1Stride.toInt()) - if (uvNormalized(header)) { - vertexBufferBuilder.normalized(UV1) - } + .normalized(UV1, uvNormalized(header)) } return vertexBufferBuilder.build(engine).apply { setBufferAt(engine, 0, data) } diff --git a/filament/include/filament/VertexBuffer.h b/filament/include/filament/VertexBuffer.h index 1c7093f6a1..fdb5d14df3 100644 --- a/filament/include/filament/VertexBuffer.h +++ b/filament/include/filament/VertexBuffer.h @@ -64,7 +64,7 @@ public: uint8_t byteStride = 0) noexcept; // default is attribute size // no-op if attribute is an invalid enum - Builder& normalized(VertexAttribute attribute) noexcept; + Builder& normalized(VertexAttribute attribute, bool normalize = true) noexcept; /** * Creates the VertexBuffer object and returns a pointer to it. diff --git a/filament/src/VertexBuffer.cpp b/filament/src/VertexBuffer.cpp index ba67a5bad0..18dc731b98 100644 --- a/filament/src/VertexBuffer.cpp +++ b/filament/src/VertexBuffer.cpp @@ -100,10 +100,15 @@ VertexBuffer::Builder& VertexBuffer::Builder::attribute(VertexAttribute attribut return *this; } -VertexBuffer::Builder& VertexBuffer::Builder::normalized(VertexAttribute attribute) noexcept { +VertexBuffer::Builder& VertexBuffer::Builder::normalized(VertexAttribute attribute, + bool normalized) noexcept { if (size_t(attribute) < MAX_ATTRIBUTE_BUFFERS_COUNT) { AttributeData& entry = mImpl->mAttributes[attribute]; - entry.flags |= Driver::Attribute::FLAG_NORMALIZED; + if (normalized) { + entry.flags |= Driver::Attribute::FLAG_NORMALIZED; + } else { + entry.flags &= ~Driver::Attribute::FLAG_NORMALIZED; + } } return *this; } diff --git a/libs/filameshio/src/MeshReader.cpp b/libs/filameshio/src/MeshReader.cpp index b4cce678a6..a30cdc7857 100644 --- a/libs/filameshio/src/MeshReader.cpp +++ b/libs/filameshio/src/MeshReader.cpp @@ -173,21 +173,17 @@ MeshReader::Mesh MeshReader::loadMeshFromBuffer(filament::Engine* engine, .attribute(VertexAttribute::COLOR, 0, VertexBuffer::AttributeType::UBYTE4, header->offsetColor, uint8_t(header->strideColor)) .attribute(VertexAttribute::UV0, 0, uvtype, - header->offsetUV0, uint8_t(header->strideUV0)); - - if (header->flags & TEXCOORD_SNORM16) { - vbb.normalized(VertexAttribute::UV0); - } + header->offsetUV0, uint8_t(header->strideUV0)) + .normalized(VertexAttribute::UV0, header->flags & TEXCOORD_SNORM16); constexpr uint32_t uintmax = std::numeric_limits::max(); const bool hasUV1 = header->offsetUV1 != uintmax && header->strideUV1 != uintmax; if (hasUV1) { - vbb.attribute(VertexAttribute::UV1, 0, VertexBuffer::AttributeType::HALF2, - header->offsetUV1, uint8_t(header->strideUV1)); - if (header->flags & TEXCOORD_SNORM16) { - vbb.normalized(VertexAttribute::UV1); - } + vbb + .attribute(VertexAttribute::UV1, 0, VertexBuffer::AttributeType::HALF2, + header->offsetUV1, uint8_t(header->strideUV1)) + .normalized(VertexAttribute::UV1); } mesh.vertexBuffer = vbb.build(*engine); diff --git a/tools/filamesh/README.md b/tools/filamesh/README.md index 0d103298bd..d5c2ad9ee1 100644 --- a/tools/filamesh/README.md +++ b/tools/filamesh/README.md @@ -204,7 +204,7 @@ Mesh loadMeshFromFile(filament::Engine* engine, const utils::Path& path, if (header->flags & FLAG_SNORM16_UV) { uvType = VertexBuffer::AttributeType::SHORT2; } - bool uvNormalized = header->flags & FLAG_SNORM16_UV; + bool uvNormalized = header->flags & FLAG_SNORM16_UV; VertexBuffer::Builder vbb; vbb.vertexCount(header->vertexCount) @@ -218,19 +218,16 @@ Mesh loadMeshFromFile(filament::Engine* engine, const utils::Path& path, .attribute(VertexAttribute::COLOR, 0, VertexBuffer::AttributeType::UBYTE4, header->offsetColor, uint8_t(header->strideColor)) .attribute(VertexAttribute::UV0, 0, uvType, - header->offsetUV0, uint8_t(header->strideUV0)); - - if (uvNormalized) { - vbb.normalized(VertexAttribute::UV0); + header->offsetUV0, uint8_t(header->strideUV0)) + .normalized(VertexAttribute::UV0, uvNormalized); } if (header->offsetUV1 != std::numeric_limits::max() && header->strideUV1 != std::numeric_limits::max()) { - vbb.attribute(VertexAttribute::UV1, 0, uvType, - header->offsetUV1, uint8_t(header->strideUV1)); - if (uvNormalized) { - vbb.normalized(VertexAttribute::UV1); - } + vbb + .attribute(VertexAttribute::UV1, 0, uvType, + header->offsetUV1, uint8_t(header->strideUV1)) + .normalized(VertexAttribute::UV1, uvNormalized); } mesh.vertexBuffer = vbb.build(*engine); diff --git a/web/filament-js/filament.d.ts b/web/filament-js/filament.d.ts index 9d1e204ba8..a8f974a588 100644 --- a/web/filament-js/filament.d.ts +++ b/web/filament-js/filament.d.ts @@ -87,6 +87,7 @@ export class VertexBuffer$Builder { atype: VertexBuffer$AttributeType, offset: number, stride: number): VertexBuffer$Builder; public normalized(attrib: VertexAttribute): VertexBuffer$Builder; + public normalizedIf(attrib: VertexAttribute, normalized: boolean): VertexBuffer$Builder; public build(engine: Engine): VertexBuffer; } diff --git a/web/filament-js/jsbindings.cpp b/web/filament-js/jsbindings.cpp index 272a7c55bb..c671e24bef 100644 --- a/web/filament-js/jsbindings.cpp +++ b/web/filament-js/jsbindings.cpp @@ -745,6 +745,9 @@ class_("VertexBuffer$Builder") .BUILDER_FUNCTION("normalized", VertexBuilder, (VertexBuilder* builder, VertexAttribute attrib), { return &builder->normalized(attrib); }) + .BUILDER_FUNCTION("normalizedIf", VertexBuilder, (VertexBuilder* builder, + VertexAttribute attrib, bool normalized), { + return &builder->normalized(attrib, normalized); }) .BUILDER_FUNCTION("bufferCount", VertexBuilder, (VertexBuilder* builder, int count), { return &builder->bufferCount(count); });