Files
filament/android/filament-android/src/main/cpp/SurfaceOrientation.cpp
2020-07-23 09:06:26 -07:00

171 lines
6.9 KiB
C++

/*
* Copyright (C) 2020 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include <jni.h>
#include <geometry/SurfaceOrientation.h>
#include "common/NioUtils.h"
#include <algorithm>
using namespace filament;
using namespace filament::geometry;
using namespace filament::math;
namespace {
struct JniWrapper {
SurfaceOrientation::Builder* builder;
AutoBuffer* normals;
AutoBuffer* tangents;
AutoBuffer* uvs;
AutoBuffer* positions;
AutoBuffer* triangles16;
AutoBuffer* triangles32;
};
}
extern "C" JNIEXPORT jlong JNICALL
Java_com_google_android_filament_SurfaceOrientation_nCreateBuilder(JNIEnv* env, jclass) {
JniWrapper* wrapper = new JniWrapper();
wrapper->builder = new SurfaceOrientation::Builder();
return (jlong) wrapper;
}
extern "C" JNIEXPORT void JNICALL
Java_com_google_android_filament_SurfaceOrientation_nDestroyBuilder(JNIEnv* env, jclass,
jlong nativeBuilder) {
auto wrapper = (JniWrapper*) nativeBuilder;
delete wrapper->builder;
delete wrapper->normals;
delete wrapper->tangents;
delete wrapper->uvs;
delete wrapper->positions;
delete wrapper->triangles16;
delete wrapper->triangles32;
delete wrapper;
}
extern "C" JNIEXPORT void JNICALL
Java_com_google_android_filament_SurfaceOrientation_nBuilderVertexCount(JNIEnv* env, jclass,
jlong nativeBuilder, int vertexCount) {
auto wrapper = (JniWrapper *) nativeBuilder;
wrapper->builder->vertexCount(vertexCount);
}
extern "C" JNIEXPORT void JNICALL
Java_com_google_android_filament_SurfaceOrientation_nBuilderTriangleCount(JNIEnv* env, jclass,
jlong nativeBuilder, int triangleCount) {
auto wrapper = (JniWrapper *) nativeBuilder;
wrapper->builder->triangleCount(triangleCount);
}
extern "C" JNIEXPORT void JNICALL
Java_com_google_android_filament_SurfaceOrientation_nBuilderNormals(JNIEnv* env, jclass,
jlong nativeBuilder, jobject javaBuffer, jint remaining, int stride) {
auto wrapper = (JniWrapper *) nativeBuilder;
AutoBuffer* buffer = wrapper->normals = new AutoBuffer(env, javaBuffer, remaining);
wrapper->builder->normals((const float3 *) buffer->getData(), stride);
}
extern "C" JNIEXPORT void JNICALL
Java_com_google_android_filament_SurfaceOrientation_nBuilderTangents(JNIEnv* env, jclass,
jlong nativeBuilder, jobject javaBuffer, jint remaining, int stride) {
auto wrapper = (JniWrapper *) nativeBuilder;
AutoBuffer* buffer = wrapper->tangents = new AutoBuffer(env, javaBuffer, remaining);
wrapper->builder->tangents((const float4 *) buffer->getData(), stride);
}
extern "C" JNIEXPORT void JNICALL
Java_com_google_android_filament_SurfaceOrientation_nBuilderUVs(JNIEnv* env, jclass,
jlong nativeBuilder, jobject javaBuffer, int remaining, int stride) {
auto wrapper = (JniWrapper *) nativeBuilder;
AutoBuffer* buffer = wrapper->uvs = new AutoBuffer(env, javaBuffer, remaining);
wrapper->builder->uvs((const float2 *) buffer->getData(), stride);
}
extern "C" JNIEXPORT void JNICALL
Java_com_google_android_filament_SurfaceOrientation_nBuilderPositions(JNIEnv* env, jclass,
jlong nativeBuilder, jobject javaBuffer, int remaining, int stride) {
auto wrapper = (JniWrapper *) nativeBuilder;
AutoBuffer* buffer = wrapper->positions = new AutoBuffer(env, javaBuffer, remaining);
wrapper->builder->positions((const float3 *) buffer->getData(), stride);
}
extern "C" JNIEXPORT void JNICALL
Java_com_google_android_filament_SurfaceOrientation_nBuilderTriangles16(JNIEnv* env, jclass,
jlong nativeBuilder, jobject javaBuffer, int remaining) {
auto wrapper = (JniWrapper *) nativeBuilder;
AutoBuffer* buffer = wrapper->triangles16 = new AutoBuffer(env, javaBuffer, remaining);
wrapper->builder->triangles((const ushort3 *) buffer->getData());
}
extern "C" JNIEXPORT void JNICALL
Java_com_google_android_filament_SurfaceOrientation_nBuilderTriangles32(JNIEnv* env, jclass,
jlong nativeBuilder, jobject javaBuffer, int remaining) {
auto wrapper = (JniWrapper *) nativeBuilder;
AutoBuffer* buffer = wrapper->triangles32 = new AutoBuffer(env, javaBuffer, remaining);
wrapper->builder->triangles((const uint3 *) buffer->getData());
}
extern "C" JNIEXPORT jlong JNICALL
Java_com_google_android_filament_SurfaceOrientation_nBuilderBuild(JNIEnv* env, jclass,
jlong nativeBuilder) {
auto wrapper = (JniWrapper *) nativeBuilder;
return (jlong) wrapper->builder->build();
}
extern "C" JNIEXPORT jint JNICALL
Java_com_google_android_filament_SurfaceOrientation_nGetVertexCount(JNIEnv* env, jclass,
jlong nativeObject) {
SurfaceOrientation* helper = (SurfaceOrientation*) nativeObject;
return helper->getVertexCount();
}
extern "C" JNIEXPORT void JNICALL
Java_com_google_android_filament_SurfaceOrientation_nGetQuatsAsFloat(JNIEnv* env, jclass,
jlong nativeObject, jobject javaBuffer, int remaining) {
SurfaceOrientation* helper = (SurfaceOrientation*) nativeObject;
AutoBuffer buffer(env, javaBuffer, remaining);
size_t requestedCount = std::min(buffer.getSize() / sizeof(float4), helper->getVertexCount());
helper->getQuats((quatf*) buffer.getData(), requestedCount);
}
extern "C" JNIEXPORT void JNICALL
Java_com_google_android_filament_SurfaceOrientation_nGetQuatsAsHalf(JNIEnv* env, jclass,
jlong nativeObject, jobject javaBuffer, int remaining) {
SurfaceOrientation* helper = (SurfaceOrientation*) nativeObject;
AutoBuffer buffer(env, javaBuffer, remaining);
size_t requestedCount = std::min(buffer.getSize() / sizeof(quath), helper->getVertexCount());
helper->getQuats((quath*) buffer.getData(), requestedCount);
}
extern "C" JNIEXPORT void JNICALL
Java_com_google_android_filament_SurfaceOrientation_nGetQuatsAsShort(JNIEnv* env, jclass,
jlong nativeObject, jobject javaBuffer, int remaining) {
SurfaceOrientation* helper = (SurfaceOrientation*) nativeObject;
AutoBuffer buffer(env, javaBuffer, remaining);
size_t requestedCount = std::min(buffer.getSize() / sizeof(short4), helper->getVertexCount());
helper->getQuats((short4*) buffer.getData(), requestedCount);
}
extern "C" JNIEXPORT void JNICALL
Java_com_google_android_filament_SurfaceOrientation_nDestroy(JNIEnv* env, jclass,
jlong nativeSurfaceOrientation) {
SurfaceOrientation* helper = (SurfaceOrientation*) nativeSurfaceOrientation;
delete helper;
}