use new Tessellator for Mesh- and ExtrusionLayer
This commit is contained in:
@@ -1,2 +1,3 @@
|
||||
cp libs/armeabi/libvtm-jni.so ../vtm-ext-libs/vtm-android/armeabi
|
||||
cp libs/armeabi-v7a/libvtm-jni.so ../vtm-ext-libs/vtm-android/armeabi-v7a
|
||||
cp libs/vtm-jni-natives.jar ../vtm-ext-libs/gdx/
|
||||
|
||||
@@ -9,14 +9,14 @@ LOCAL_CPPFLAGS := $(LOCAL_C_INCLUDES:%=-I%) -O2 -Wall -D__ANDROID__ -Wall -std=c
|
||||
LOCAL_LDLIBS := -lm -llog
|
||||
LOCAL_ARM_MODE := arm
|
||||
|
||||
LOCAL_SRC_FILES := libtess2/Source/sweep.c\
|
||||
LOCAL_SRC_FILES := org.oscim.utils.TessJNI.cpp\
|
||||
libtess2/Source/sweep.c\
|
||||
libtess2/Source/priorityq.c\
|
||||
libtess2/Source/bucketalloc.c\
|
||||
libtess2/Source/geom.c\
|
||||
libtess2/Source/tess.c\
|
||||
libtess2/Source/dict.c\
|
||||
libtess2/Source/mesh.c\
|
||||
org.oscim.utils.tess.Tesselator.cpp\
|
||||
gl/utils.c
|
||||
|
||||
include $(BUILD_SHARED_LIBRARY)
|
||||
|
||||
155
jni/jni/org.oscim.utils.TessJNI.h
Normal file
155
jni/jni/org.oscim.utils.TessJNI.h
Normal file
@@ -0,0 +1,155 @@
|
||||
/* DO NOT EDIT THIS FILE - it is machine generated */
|
||||
#include <jni.h>
|
||||
/* Header for class org_oscim_utils_TessJNI */
|
||||
|
||||
#ifndef _Included_org_oscim_utils_TessJNI
|
||||
#define _Included_org_oscim_utils_TessJNI
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
/*
|
||||
* Class: org_oscim_utils_TessJNI
|
||||
* Method: newTess
|
||||
* Signature: (I)J
|
||||
*/
|
||||
JNIEXPORT jlong JNICALL Java_org_oscim_utils_TessJNI_newTess
|
||||
(JNIEnv *, jclass, jint);
|
||||
|
||||
/*
|
||||
* Class: org_oscim_utils_TessJNI
|
||||
* Method: freeTess
|
||||
* Signature: (J)V
|
||||
*/
|
||||
JNIEXPORT void JNICALL Java_org_oscim_utils_TessJNI_freeTess
|
||||
(JNIEnv *, jclass, jlong);
|
||||
|
||||
/*
|
||||
* Class: org_oscim_utils_TessJNI
|
||||
* Method: addContour
|
||||
* Signature: (JI[FIII)V
|
||||
*/
|
||||
JNIEXPORT void JNICALL Java_org_oscim_utils_TessJNI_addContour
|
||||
(JNIEnv *, jclass, jlong, jint, jfloatArray, jint, jint, jint);
|
||||
|
||||
/*
|
||||
* Class: org_oscim_utils_TessJNI
|
||||
* Method: addMultiContour2D
|
||||
* Signature: (J[I[FII)V
|
||||
*/
|
||||
JNIEXPORT void JNICALL Java_org_oscim_utils_TessJNI_addMultiContour2D
|
||||
(JNIEnv *, jclass, jlong, jintArray, jfloatArray, jint, jint);
|
||||
|
||||
/*
|
||||
* Class: org_oscim_utils_TessJNI
|
||||
* Method: tessContour2D
|
||||
* Signature: (JIIII)I
|
||||
*/
|
||||
JNIEXPORT jint JNICALL Java_org_oscim_utils_TessJNI_tessContour2D
|
||||
(JNIEnv *, jclass, jlong, jint, jint, jint, jint);
|
||||
|
||||
/*
|
||||
* Class: org_oscim_utils_TessJNI
|
||||
* Method: getVertexCount
|
||||
* Signature: (J)I
|
||||
*/
|
||||
JNIEXPORT jint JNICALL Java_org_oscim_utils_TessJNI_getVertexCount
|
||||
(JNIEnv *, jclass, jlong);
|
||||
|
||||
/*
|
||||
* Class: org_oscim_utils_TessJNI
|
||||
* Method: getVertices
|
||||
* Signature: (J[FII)Z
|
||||
*/
|
||||
JNIEXPORT jboolean JNICALL Java_org_oscim_utils_TessJNI_getVertices
|
||||
(JNIEnv *, jclass, jlong, jfloatArray, jint, jint);
|
||||
|
||||
/*
|
||||
* Class: org_oscim_utils_TessJNI
|
||||
* Method: getVerticesS
|
||||
* Signature: (J[SIIF)V
|
||||
*/
|
||||
JNIEXPORT void JNICALL Java_org_oscim_utils_TessJNI_getVerticesS
|
||||
(JNIEnv *, jclass, jlong, jshortArray, jint, jint, jfloat);
|
||||
|
||||
/*
|
||||
* Class: org_oscim_utils_TessJNI
|
||||
* Method: getVertexIndices
|
||||
* Signature: (J[III)Z
|
||||
*/
|
||||
JNIEXPORT jboolean JNICALL Java_org_oscim_utils_TessJNI_getVertexIndices
|
||||
(JNIEnv *, jclass, jlong, jintArray, jint, jint);
|
||||
|
||||
/*
|
||||
* Class: org_oscim_utils_TessJNI
|
||||
* Method: getElementCount
|
||||
* Signature: (J)I
|
||||
*/
|
||||
JNIEXPORT jint JNICALL Java_org_oscim_utils_TessJNI_getElementCount
|
||||
(JNIEnv *, jclass, jlong);
|
||||
|
||||
/*
|
||||
* Class: org_oscim_utils_TessJNI
|
||||
* Method: getElements
|
||||
* Signature: (J[III)Z
|
||||
*/
|
||||
JNIEXPORT jboolean JNICALL Java_org_oscim_utils_TessJNI_getElements
|
||||
(JNIEnv *, jclass, jlong, jintArray, jint, jint);
|
||||
|
||||
/*
|
||||
* Class: org_oscim_utils_TessJNI
|
||||
* Method: getElementsS
|
||||
* Signature: (J[SII)V
|
||||
*/
|
||||
JNIEXPORT void JNICALL Java_org_oscim_utils_TessJNI_getElementsS
|
||||
(JNIEnv *, jclass, jlong, jshortArray, jint, jint);
|
||||
|
||||
/*
|
||||
* Class: org_oscim_utils_TessJNI
|
||||
* Method: getElementsWithInputVertexIds
|
||||
* Signature: (J[SIII)V
|
||||
*/
|
||||
JNIEXPORT void JNICALL Java_org_oscim_utils_TessJNI_getElementsWithInputVertexIds
|
||||
(JNIEnv *, jclass, jlong, jshortArray, jint, jint, jint);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
#endif
|
||||
/* Header for class org_oscim_utils_TessJNI_ElementType */
|
||||
|
||||
#ifndef _Included_org_oscim_utils_TessJNI_ElementType
|
||||
#define _Included_org_oscim_utils_TessJNI_ElementType
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
#undef org_oscim_utils_TessJNI_ElementType_POLYGONS
|
||||
#define org_oscim_utils_TessJNI_ElementType_POLYGONS 0L
|
||||
#undef org_oscim_utils_TessJNI_ElementType_CONNECTED_POLYGONS
|
||||
#define org_oscim_utils_TessJNI_ElementType_CONNECTED_POLYGONS 1L
|
||||
#undef org_oscim_utils_TessJNI_ElementType_BOUNDARY_CONTOURS
|
||||
#define org_oscim_utils_TessJNI_ElementType_BOUNDARY_CONTOURS 2L
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
#endif
|
||||
/* Header for class org_oscim_utils_TessJNI_WindingRule */
|
||||
|
||||
#ifndef _Included_org_oscim_utils_TessJNI_WindingRule
|
||||
#define _Included_org_oscim_utils_TessJNI_WindingRule
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
#undef org_oscim_utils_TessJNI_WindingRule_ODD
|
||||
#define org_oscim_utils_TessJNI_WindingRule_ODD 0L
|
||||
#undef org_oscim_utils_TessJNI_WindingRule_NONZERO
|
||||
#define org_oscim_utils_TessJNI_WindingRule_NONZERO 1L
|
||||
#undef org_oscim_utils_TessJNI_WindingRule_POSITIVE
|
||||
#define org_oscim_utils_TessJNI_WindingRule_POSITIVE 2L
|
||||
#undef org_oscim_utils_TessJNI_WindingRule_NEGATIVE
|
||||
#define org_oscim_utils_TessJNI_WindingRule_NEGATIVE 3L
|
||||
#undef org_oscim_utils_TessJNI_WindingRule_ABS_GEQ_TWO
|
||||
#define org_oscim_utils_TessJNI_WindingRule_ABS_GEQ_TWO 4L
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
#endif
|
||||
@@ -1,224 +0,0 @@
|
||||
#include <org.oscim.utils.tess.Tesselator.h>
|
||||
|
||||
//@line:103
|
||||
|
||||
#include <tesselator.h>
|
||||
#include <string.h>
|
||||
JNIEXPORT jlong JNICALL Java_org_oscim_utils_tess_Tesselator_newTess(JNIEnv* env, jclass clazz) {
|
||||
|
||||
|
||||
//@line:107
|
||||
{
|
||||
return (long)tessNewTess(0);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
JNIEXPORT void JNICALL Java_org_oscim_utils_tess_Tesselator_freeTess(JNIEnv* env, jclass clazz, jlong inst) {
|
||||
|
||||
|
||||
//@line:111
|
||||
{
|
||||
tessDeleteTess((TESStesselator*) inst);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
JNIEXPORT void JNICALL Java_org_oscim_utils_tess_Tesselator_addContour(JNIEnv* env, jclass clazz, jlong inst, jint size, jfloatArray obj_contour, jint stride, jint offset, jint count) {
|
||||
float* contour = (float*)env->GetPrimitiveArrayCritical(obj_contour, 0);
|
||||
|
||||
|
||||
//@line:125
|
||||
{
|
||||
tessAddContour((TESStesselator*) inst, size, contour + (offset * stride), stride, count);
|
||||
}
|
||||
env->ReleasePrimitiveArrayCritical(obj_contour, contour, 0);
|
||||
|
||||
}
|
||||
|
||||
JNIEXPORT void JNICALL Java_org_oscim_utils_tess_Tesselator_addMultiContour2D(JNIEnv* env, jclass clazz, jlong inst, jintArray obj_index, jfloatArray obj_contour, jint idxStart, jint idxCount) {
|
||||
int* index = (int*)env->GetPrimitiveArrayCritical(obj_index, 0);
|
||||
float* contour = (float*)env->GetPrimitiveArrayCritical(obj_contour, 0);
|
||||
|
||||
|
||||
//@line:129
|
||||
{
|
||||
TESStesselator* tess = (TESStesselator*) inst;
|
||||
int offset = 0;
|
||||
|
||||
for (int i = 0; i < idxStart + idxCount; i++){
|
||||
int len = index[i];
|
||||
|
||||
if ((len % 2 != 0) || (len < 0))
|
||||
break;
|
||||
|
||||
if (len < 6 || i < idxStart) {
|
||||
offset += len;
|
||||
continue;
|
||||
}
|
||||
|
||||
tessAddContour(tess, 2, contour + offset, 8, len >> 1);
|
||||
|
||||
offset += len;
|
||||
}
|
||||
}
|
||||
env->ReleasePrimitiveArrayCritical(obj_index, index, 0);
|
||||
env->ReleasePrimitiveArrayCritical(obj_contour, contour, 0);
|
||||
|
||||
}
|
||||
|
||||
JNIEXPORT jint JNICALL Java_org_oscim_utils_tess_Tesselator_tessContour2D(JNIEnv* env, jclass clazz, jlong inst, jint windingRule, jint elementType, jint polySize, jint vertexSize) {
|
||||
|
||||
|
||||
//@line:161
|
||||
{
|
||||
return tessTesselate((TESStesselator*) inst, windingRule, elementType, polySize, vertexSize, 0);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
JNIEXPORT jint JNICALL Java_org_oscim_utils_tess_Tesselator_getVertexCount(JNIEnv* env, jclass clazz, jlong inst) {
|
||||
|
||||
|
||||
//@line:165
|
||||
{
|
||||
return tessGetVertexCount((TESStesselator*) inst);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
static inline jboolean wrapped_Java_org_oscim_utils_tess_Tesselator_getVertices
|
||||
(JNIEnv* env, jclass clazz, jlong inst, jfloatArray obj_out, jint offset, jint length, float* out) {
|
||||
|
||||
//@line:172
|
||||
{
|
||||
const TESSIOreal* vertices = tessGetVertices((TESStesselator*) inst);
|
||||
|
||||
//const TESSreal* vertices = tessGetVertices((TESStesselator*) inst);
|
||||
|
||||
if (!vertices)
|
||||
return 0;
|
||||
|
||||
memcpy(out, vertices + offset, length * sizeof(TESSIOreal));
|
||||
|
||||
//memcpy(out, vertices + offset, length * sizeof(TESSreal));
|
||||
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
|
||||
JNIEXPORT jboolean JNICALL Java_org_oscim_utils_tess_Tesselator_getVertices(JNIEnv* env, jclass clazz, jlong inst, jfloatArray obj_out, jint offset, jint length) {
|
||||
float* out = (float*)env->GetPrimitiveArrayCritical(obj_out, 0);
|
||||
|
||||
jboolean JNI_returnValue = wrapped_Java_org_oscim_utils_tess_Tesselator_getVertices(env, clazz, inst, obj_out, offset, length, out);
|
||||
|
||||
env->ReleasePrimitiveArrayCritical(obj_out, out, 0);
|
||||
|
||||
return JNI_returnValue;
|
||||
}
|
||||
|
||||
JNIEXPORT void JNICALL Java_org_oscim_utils_tess_Tesselator_getVerticesS(JNIEnv* env, jclass clazz, jlong inst, jshortArray obj_out, jint offset, jint length, jfloat scale) {
|
||||
short* out = (short*)env->GetPrimitiveArrayCritical(obj_out, 0);
|
||||
|
||||
|
||||
//@line:190
|
||||
{
|
||||
const TESSIOreal* vertices = tessGetVertices((TESStesselator*) inst);
|
||||
|
||||
//const TESSreal* vertices = tessGetVertices((TESStesselator*) inst);
|
||||
|
||||
for(int i = 0; i < length; i++)
|
||||
out[i] = (short)(vertices[offset++] * scale + 0.5f);
|
||||
}
|
||||
env->ReleasePrimitiveArrayCritical(obj_out, out, 0);
|
||||
|
||||
}
|
||||
|
||||
static inline jboolean wrapped_Java_org_oscim_utils_tess_Tesselator_getVertexIndices
|
||||
(JNIEnv* env, jclass clazz, jlong inst, jintArray obj_out, jint offset, jint length, int* out) {
|
||||
|
||||
//@line:206
|
||||
{
|
||||
const TESSindex* indices = tessGetVertexIndices((TESStesselator*) inst);
|
||||
if (!indices)
|
||||
return 0;
|
||||
|
||||
memcpy(out, indices + offset, length * sizeof(TESSindex));
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
|
||||
JNIEXPORT jboolean JNICALL Java_org_oscim_utils_tess_Tesselator_getVertexIndices(JNIEnv* env, jclass clazz, jlong inst, jintArray obj_out, jint offset, jint length) {
|
||||
int* out = (int*)env->GetPrimitiveArrayCritical(obj_out, 0);
|
||||
|
||||
jboolean JNI_returnValue = wrapped_Java_org_oscim_utils_tess_Tesselator_getVertexIndices(env, clazz, inst, obj_out, offset, length, out);
|
||||
|
||||
env->ReleasePrimitiveArrayCritical(obj_out, out, 0);
|
||||
|
||||
return JNI_returnValue;
|
||||
}
|
||||
|
||||
JNIEXPORT jint JNICALL Java_org_oscim_utils_tess_Tesselator_getElementCount(JNIEnv* env, jclass clazz, jlong inst) {
|
||||
|
||||
|
||||
//@line:218
|
||||
{
|
||||
return tessGetElementCount((TESStesselator*) inst);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
static inline jboolean wrapped_Java_org_oscim_utils_tess_Tesselator_getElements
|
||||
(JNIEnv* env, jclass clazz, jlong inst, jintArray obj_out, jint offset, jint length, int* out) {
|
||||
|
||||
//@line:225
|
||||
{
|
||||
const TESSindex* elements = tessGetElements((TESStesselator*) inst);
|
||||
if (!elements)
|
||||
return 0;
|
||||
|
||||
memcpy(out, elements + offset, length * sizeof(TESSindex));
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
|
||||
JNIEXPORT jboolean JNICALL Java_org_oscim_utils_tess_Tesselator_getElements(JNIEnv* env, jclass clazz, jlong inst, jintArray obj_out, jint offset, jint length) {
|
||||
int* out = (int*)env->GetPrimitiveArrayCritical(obj_out, 0);
|
||||
|
||||
jboolean JNI_returnValue = wrapped_Java_org_oscim_utils_tess_Tesselator_getElements(env, clazz, inst, obj_out, offset, length, out);
|
||||
|
||||
env->ReleasePrimitiveArrayCritical(obj_out, out, 0);
|
||||
|
||||
return JNI_returnValue;
|
||||
}
|
||||
|
||||
JNIEXPORT void JNICALL Java_org_oscim_utils_tess_Tesselator_getElementsS(JNIEnv* env, jclass clazz, jlong inst, jshortArray obj_out, jint offset, jint length) {
|
||||
short* out = (short*)env->GetPrimitiveArrayCritical(obj_out, 0);
|
||||
|
||||
|
||||
//@line:238
|
||||
{
|
||||
const TESSindex* elements = tessGetElements((TESStesselator*) inst);
|
||||
for(int i = 0; i < length; i++)
|
||||
out[i] = (short)elements[offset++];
|
||||
}
|
||||
env->ReleasePrimitiveArrayCritical(obj_out, out, 0);
|
||||
|
||||
}
|
||||
|
||||
JNIEXPORT void JNICALL Java_org_oscim_utils_tess_Tesselator_getElementsWithInputVertexIds(JNIEnv* env, jclass clazz, jlong inst, jshortArray obj_out, jint dstOffset, jint offset, jint length) {
|
||||
short* out = (short*)env->GetPrimitiveArrayCritical(obj_out, 0);
|
||||
|
||||
|
||||
//@line:247
|
||||
{
|
||||
const TESSindex* elements = tessGetElements((TESStesselator*) inst);
|
||||
const TESSindex* indices = tessGetVertexIndices((TESStesselator*) inst);
|
||||
|
||||
for(int i = 0; i < length; i++)
|
||||
out[dstOffset++] = (short)indices[elements[offset++]];
|
||||
}
|
||||
env->ReleasePrimitiveArrayCritical(obj_out, out, 0);
|
||||
|
||||
}
|
||||
|
||||
@@ -1,155 +0,0 @@
|
||||
/* DO NOT EDIT THIS FILE - it is machine generated */
|
||||
#include <jni.h>
|
||||
/* Header for class org_oscim_utils_tess_Tesselator */
|
||||
|
||||
#ifndef _Included_org_oscim_utils_tess_Tesselator
|
||||
#define _Included_org_oscim_utils_tess_Tesselator
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
/*
|
||||
* Class: org_oscim_utils_tess_Tesselator
|
||||
* Method: newTess
|
||||
* Signature: ()J
|
||||
*/
|
||||
JNIEXPORT jlong JNICALL Java_org_oscim_utils_tess_Tesselator_newTess
|
||||
(JNIEnv *, jclass);
|
||||
|
||||
/*
|
||||
* Class: org_oscim_utils_tess_Tesselator
|
||||
* Method: freeTess
|
||||
* Signature: (J)V
|
||||
*/
|
||||
JNIEXPORT void JNICALL Java_org_oscim_utils_tess_Tesselator_freeTess
|
||||
(JNIEnv *, jclass, jlong);
|
||||
|
||||
/*
|
||||
* Class: org_oscim_utils_tess_Tesselator
|
||||
* Method: addContour
|
||||
* Signature: (JI[FIII)V
|
||||
*/
|
||||
JNIEXPORT void JNICALL Java_org_oscim_utils_tess_Tesselator_addContour
|
||||
(JNIEnv *, jclass, jlong, jint, jfloatArray, jint, jint, jint);
|
||||
|
||||
/*
|
||||
* Class: org_oscim_utils_tess_Tesselator
|
||||
* Method: addMultiContour2D
|
||||
* Signature: (J[I[FII)V
|
||||
*/
|
||||
JNIEXPORT void JNICALL Java_org_oscim_utils_tess_Tesselator_addMultiContour2D
|
||||
(JNIEnv *, jclass, jlong, jintArray, jfloatArray, jint, jint);
|
||||
|
||||
/*
|
||||
* Class: org_oscim_utils_tess_Tesselator
|
||||
* Method: tessContour2D
|
||||
* Signature: (JIIII)I
|
||||
*/
|
||||
JNIEXPORT jint JNICALL Java_org_oscim_utils_tess_Tesselator_tessContour2D
|
||||
(JNIEnv *, jclass, jlong, jint, jint, jint, jint);
|
||||
|
||||
/*
|
||||
* Class: org_oscim_utils_tess_Tesselator
|
||||
* Method: getVertexCount
|
||||
* Signature: (J)I
|
||||
*/
|
||||
JNIEXPORT jint JNICALL Java_org_oscim_utils_tess_Tesselator_getVertexCount
|
||||
(JNIEnv *, jclass, jlong);
|
||||
|
||||
/*
|
||||
* Class: org_oscim_utils_tess_Tesselator
|
||||
* Method: getVertices
|
||||
* Signature: (J[FII)Z
|
||||
*/
|
||||
JNIEXPORT jboolean JNICALL Java_org_oscim_utils_tess_Tesselator_getVertices
|
||||
(JNIEnv *, jclass, jlong, jfloatArray, jint, jint);
|
||||
|
||||
/*
|
||||
* Class: org_oscim_utils_tess_Tesselator
|
||||
* Method: getVerticesS
|
||||
* Signature: (J[SIIF)V
|
||||
*/
|
||||
JNIEXPORT void JNICALL Java_org_oscim_utils_tess_Tesselator_getVerticesS
|
||||
(JNIEnv *, jclass, jlong, jshortArray, jint, jint, jfloat);
|
||||
|
||||
/*
|
||||
* Class: org_oscim_utils_tess_Tesselator
|
||||
* Method: getVertexIndices
|
||||
* Signature: (J[III)Z
|
||||
*/
|
||||
JNIEXPORT jboolean JNICALL Java_org_oscim_utils_tess_Tesselator_getVertexIndices
|
||||
(JNIEnv *, jclass, jlong, jintArray, jint, jint);
|
||||
|
||||
/*
|
||||
* Class: org_oscim_utils_tess_Tesselator
|
||||
* Method: getElementCount
|
||||
* Signature: (J)I
|
||||
*/
|
||||
JNIEXPORT jint JNICALL Java_org_oscim_utils_tess_Tesselator_getElementCount
|
||||
(JNIEnv *, jclass, jlong);
|
||||
|
||||
/*
|
||||
* Class: org_oscim_utils_tess_Tesselator
|
||||
* Method: getElements
|
||||
* Signature: (J[III)Z
|
||||
*/
|
||||
JNIEXPORT jboolean JNICALL Java_org_oscim_utils_tess_Tesselator_getElements
|
||||
(JNIEnv *, jclass, jlong, jintArray, jint, jint);
|
||||
|
||||
/*
|
||||
* Class: org_oscim_utils_tess_Tesselator
|
||||
* Method: getElementsS
|
||||
* Signature: (J[SII)V
|
||||
*/
|
||||
JNIEXPORT void JNICALL Java_org_oscim_utils_tess_Tesselator_getElementsS
|
||||
(JNIEnv *, jclass, jlong, jshortArray, jint, jint);
|
||||
|
||||
/*
|
||||
* Class: org_oscim_utils_tess_Tesselator
|
||||
* Method: getElementsWithInputVertexIds
|
||||
* Signature: (J[SIII)V
|
||||
*/
|
||||
JNIEXPORT void JNICALL Java_org_oscim_utils_tess_Tesselator_getElementsWithInputVertexIds
|
||||
(JNIEnv *, jclass, jlong, jshortArray, jint, jint, jint);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
#endif
|
||||
/* Header for class org_oscim_utils_tess_Tesselator_ElementType */
|
||||
|
||||
#ifndef _Included_org_oscim_utils_tess_Tesselator_ElementType
|
||||
#define _Included_org_oscim_utils_tess_Tesselator_ElementType
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
#undef org_oscim_utils_tess_Tesselator_ElementType_POLYGONS
|
||||
#define org_oscim_utils_tess_Tesselator_ElementType_POLYGONS 0L
|
||||
#undef org_oscim_utils_tess_Tesselator_ElementType_CONNECTED_POLYGONS
|
||||
#define org_oscim_utils_tess_Tesselator_ElementType_CONNECTED_POLYGONS 1L
|
||||
#undef org_oscim_utils_tess_Tesselator_ElementType_BOUNDARY_CONTOURS
|
||||
#define org_oscim_utils_tess_Tesselator_ElementType_BOUNDARY_CONTOURS 2L
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
#endif
|
||||
/* Header for class org_oscim_utils_tess_Tesselator_WindingRule */
|
||||
|
||||
#ifndef _Included_org_oscim_utils_tess_Tesselator_WindingRule
|
||||
#define _Included_org_oscim_utils_tess_Tesselator_WindingRule
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
#undef org_oscim_utils_tess_Tesselator_WindingRule_ODD
|
||||
#define org_oscim_utils_tess_Tesselator_WindingRule_ODD 0L
|
||||
#undef org_oscim_utils_tess_Tesselator_WindingRule_NONZERO
|
||||
#define org_oscim_utils_tess_Tesselator_WindingRule_NONZERO 1L
|
||||
#undef org_oscim_utils_tess_Tesselator_WindingRule_POSITIVE
|
||||
#define org_oscim_utils_tess_Tesselator_WindingRule_POSITIVE 2L
|
||||
#undef org_oscim_utils_tess_Tesselator_WindingRule_NEGATIVE
|
||||
#define org_oscim_utils_tess_Tesselator_WindingRule_NEGATIVE 3L
|
||||
#undef org_oscim_utils_tess_Tesselator_WindingRule_ABS_GEQ_TWO
|
||||
#define org_oscim_utils_tess_Tesselator_WindingRule_ABS_GEQ_TWO 4L
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
#endif
|
||||
@@ -1,16 +1,14 @@
|
||||
package org.oscim.utils.tess;
|
||||
|
||||
import static java.lang.System.out;
|
||||
|
||||
import java.io.File;
|
||||
import java.util.Arrays;
|
||||
|
||||
public class Tesselator {
|
||||
package org.oscim.utils;
|
||||
|
||||
public class TessJNI {
|
||||
private long inst;
|
||||
|
||||
public Tesselator() {
|
||||
inst = newTess();
|
||||
public TessJNI() {
|
||||
inst = newTess(0);
|
||||
}
|
||||
|
||||
public TessJNI(int bucketSize) {
|
||||
inst = newTess(bucketSize);
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -25,6 +23,10 @@ public class Tesselator {
|
||||
}
|
||||
}
|
||||
|
||||
protected long instance() {
|
||||
return inst;
|
||||
}
|
||||
|
||||
/**
|
||||
* See OpenGL Red Book for description of the winding rules
|
||||
* http://www.glprogramming.com/red/chapter11.html
|
||||
@@ -52,9 +54,8 @@ public class Tesselator {
|
||||
return;
|
||||
if ((length % 2 != 0) || (offset % 2 != 0) || (points.length >> 1) < (offset + length))
|
||||
throw new IllegalArgumentException("Invalid input: length:" + length
|
||||
+ ", offset:" + offset
|
||||
+ ", points.length:" + points.length);
|
||||
|
||||
+ ", offset:" + offset
|
||||
+ ", points.length:" + points.length);
|
||||
addContour(inst, 2, points, 8, offset, length);
|
||||
}
|
||||
|
||||
@@ -62,6 +63,17 @@ public class Tesselator {
|
||||
addMultiContour2D(inst, index, contour, 0, index.length);
|
||||
}
|
||||
|
||||
public void addContour2D(int[] index, float[] contour, int idxStart, int idxEnd) {
|
||||
addMultiContour2D(inst, index, contour, idxStart, idxEnd);
|
||||
}
|
||||
|
||||
public boolean tesselate() {
|
||||
return tessContour2D(inst,
|
||||
TessJNI.WindingRule.POSITIVE,
|
||||
TessJNI.ElementType.POLYGONS,
|
||||
3, 2) == 1;
|
||||
}
|
||||
|
||||
public boolean tesselate(int windingRule, int elementType) {
|
||||
return tessContour2D(inst, windingRule, elementType, 3, 2) == 1;
|
||||
}
|
||||
@@ -94,25 +106,52 @@ public class Tesselator {
|
||||
getVertexIndices(inst, out, offset, length);
|
||||
}
|
||||
|
||||
public void getElementsWithInputVertexIds(short[] out, int dstOffset, int offset, int length) {
|
||||
getElementsWithInputVertexIds(inst, out, dstOffset, offset, length);
|
||||
public void getElementsWithInputVertexIds(short[] dst, int dstOffset, int offset, int length) {
|
||||
getElementsWithInputVertexIds(inst, dst, dstOffset, offset, length);
|
||||
}
|
||||
|
||||
// @formatter:off
|
||||
|
||||
/*JNI
|
||||
#include <tesselator.h>
|
||||
#include <string.h>
|
||||
#include <stdlib.h>
|
||||
void* heapAlloc( void* userData, unsigned int size ){
|
||||
TESS_NOTUSED( userData );
|
||||
return malloc( size );
|
||||
}
|
||||
void* heapRealloc( void *userData, void* ptr, unsigned int size ){
|
||||
TESS_NOTUSED( userData );
|
||||
return realloc( ptr, size );
|
||||
}
|
||||
void heapFree( void* userData, void* ptr ){
|
||||
TESS_NOTUSED( userData );
|
||||
free( ptr );
|
||||
}
|
||||
*/
|
||||
private static native long newTess(); /* {
|
||||
return (long)tessNewTess(0);
|
||||
static native long newTess(int size); /* {
|
||||
if (size <= 0)
|
||||
return (long)tessNewTess(0);
|
||||
if (size > 10)
|
||||
size = 10;
|
||||
TESSalloc ma;
|
||||
memset(&ma, 0, sizeof(ma));
|
||||
ma.memalloc = heapAlloc;
|
||||
ma.memfree = heapFree;
|
||||
ma.memrealloc = heapRealloc;
|
||||
//ma.userData = (void*)&allocated;
|
||||
ma.meshEdgeBucketSize = 2 << size; // 512
|
||||
ma.meshVertexBucketSize = 2 << size; // 512
|
||||
ma.meshFaceBucketSize = 1 << size; // 256
|
||||
ma.dictNodeBucketSize = 2 << size; // 512
|
||||
ma.regionBucketSize = 1 << size; // 256
|
||||
ma.extraVertices = 8;
|
||||
//ma.extraVertices = 256;
|
||||
return (long)tessNewTess(&ma);
|
||||
} */
|
||||
|
||||
private static native void freeTess(long inst); /* {
|
||||
static native void freeTess(long inst); /* {
|
||||
tessDeleteTess((TESStesselator*) inst);
|
||||
} */
|
||||
|
||||
/**
|
||||
/**
|
||||
* Adds a contour to be tesselated.
|
||||
* The type of the vertex coordinates is assumed to be TESSreal.
|
||||
*
|
||||
@@ -120,220 +159,107 @@ public class Tesselator {
|
||||
* @param size - number of coordinates per vertex. Must be 2 or 3.
|
||||
* @param pointer - pointer to the first coordinate of the first vertex in the array.
|
||||
* @param stride - defines offset in bytes between consecutive vertices.
|
||||
* @param count - number of vertices in contour.
|
||||
* @param count - number of vertices in contour.
|
||||
*/
|
||||
private static native void addContour(long inst, int size, float[] contour, int stride, int offset, int count);/* {
|
||||
static native void addContour(long inst, int size, float[] contour, int stride, int offset, int count);/* {
|
||||
tessAddContour((TESStesselator*) inst, size, contour + (offset * stride), stride, count);
|
||||
} */
|
||||
|
||||
private static native void addMultiContour2D(long inst, int[] index, float[] contour, int idxStart, int idxCount);/* {
|
||||
static native void addMultiContour2D(long inst, int[] index, float[] contour, int idxStart, int idxCount);/* {
|
||||
TESStesselator* tess = (TESStesselator*) inst;
|
||||
int offset = 0;
|
||||
|
||||
// start at 0 to get the correct offset in contour..
|
||||
for (int i = 0; i < idxStart + idxCount; i++){
|
||||
int len = index[i];
|
||||
|
||||
if ((len % 2 != 0) || (len < 0))
|
||||
break;
|
||||
|
||||
if (len < 6 || i < idxStart) {
|
||||
offset += len;
|
||||
continue;
|
||||
}
|
||||
|
||||
tessAddContour(tess, 2, contour + offset, 8, len >> 1);
|
||||
|
||||
offset += len;
|
||||
}
|
||||
} */
|
||||
|
||||
/**
|
||||
* Tesselate contours.
|
||||
*
|
||||
*
|
||||
* @param tess - pointer to tesselator object.
|
||||
* @param windingRule - winding rules used for tesselation, must be one of TessWindingRule.
|
||||
* @param elementType - defines the tesselation result element type, must be one of TessElementType.
|
||||
* @param polySize - defines maximum vertices per polygons if output is polygons.
|
||||
* @param vertexSize - defines the number of coordinates in tesselation result vertex, must be 2 or 3.
|
||||
* @param normal - defines the normal of the input contours, of null the normal is calculated automatically.
|
||||
* @return 1 if succeed, 0 if failed.
|
||||
* @return 1 if succeed, 0 if failed.
|
||||
*/
|
||||
private static native int tessContour2D(long inst, int windingRule, int elementType, int polySize, int vertexSize);/*{
|
||||
static native int tessContour2D(long inst, int windingRule, int elementType, int polySize, int vertexSize);/*{
|
||||
return tessTesselate((TESStesselator*) inst, windingRule, elementType, polySize, vertexSize, 0);
|
||||
} */
|
||||
|
||||
private static native int getVertexCount(long inst); /*{
|
||||
static native int getVertexCount(long inst); /*{
|
||||
return tessGetVertexCount((TESStesselator*) inst);
|
||||
}*/
|
||||
|
||||
/**
|
||||
* Returns pointer to first coordinate of first vertex.
|
||||
*/
|
||||
private static native boolean getVertices(long inst, float[] out, int offset, int length);/*{
|
||||
const TESSIOreal* vertices = tessGetVertices((TESStesselator*) inst);
|
||||
|
||||
//const TESSreal* vertices = tessGetVertices((TESStesselator*) inst);
|
||||
|
||||
static native boolean getVertices(long inst, float[] out, int offset, int length);/*{
|
||||
const TESSreal* vertices = tessGetVertices((TESStesselator*) inst);
|
||||
if (!vertices)
|
||||
return 0;
|
||||
|
||||
memcpy(out, vertices + offset, length * sizeof(TESSIOreal));
|
||||
|
||||
//memcpy(out, vertices + offset, length * sizeof(TESSreal));
|
||||
|
||||
memcpy(out, vertices + offset, length * sizeof(TESSreal));
|
||||
return 1;
|
||||
}*/
|
||||
|
||||
/**
|
||||
* Returns pointer to first coordinate of first vertex.
|
||||
*/
|
||||
private static native void getVerticesS(long inst, short[] out, int offset, int length, float scale);/*{
|
||||
const TESSIOreal* vertices = tessGetVertices((TESStesselator*) inst);
|
||||
|
||||
//const TESSreal* vertices = tessGetVertices((TESStesselator*) inst);
|
||||
|
||||
static native void getVerticesS(long inst, short[] out, int offset, int length, float scale);/*{
|
||||
const TESSreal* vertices = tessGetVertices((TESStesselator*) inst);
|
||||
for(int i = 0; i < length; i++)
|
||||
out[i] = (short)(vertices[offset++] * scale + 0.5f);
|
||||
}*/
|
||||
|
||||
/**
|
||||
* Returns pointer to first vertex index.
|
||||
*
|
||||
*
|
||||
* Vertex indices can be used to map the generated vertices to the original vertices.
|
||||
* Every point added using tessAddContour() will get a new index starting at 0.
|
||||
* New vertices generated at the intersections of segments are assigned value TESS_UNDEF.
|
||||
*/
|
||||
private static native boolean getVertexIndices(long inst, int[] out, int offset, int length);/* {
|
||||
static native boolean getVertexIndices(long inst, int[] out, int offset, int length);/* {
|
||||
const TESSindex* indices = tessGetVertexIndices((TESStesselator*) inst);
|
||||
if (!indices)
|
||||
return 0;
|
||||
|
||||
memcpy(out, indices + offset, length * sizeof(TESSindex));
|
||||
return 1;
|
||||
} */
|
||||
|
||||
/**
|
||||
* Returns number of elements in the the tesselated output.
|
||||
*/
|
||||
private static native int getElementCount(long inst);/*{
|
||||
static native int getElementCount(long inst);/*{
|
||||
return tessGetElementCount((TESStesselator*) inst);
|
||||
}*/
|
||||
|
||||
/**
|
||||
* Returns pointer to the first element.
|
||||
* Returns pointer to the first element.
|
||||
*/
|
||||
private static native boolean getElements(long inst, int[] out, int offset, int length);/*{
|
||||
static native boolean getElements(long inst, int[] out, int offset, int length);/*{
|
||||
const TESSindex* elements = tessGetElements((TESStesselator*) inst);
|
||||
if (!elements)
|
||||
return 0;
|
||||
|
||||
memcpy(out, elements + offset, length * sizeof(TESSindex));
|
||||
return 1;
|
||||
}*/
|
||||
|
||||
|
||||
/**
|
||||
* Returns pointer to the first element.
|
||||
* Returns pointer to the first element.
|
||||
*/
|
||||
private static native void getElementsS(long inst, short[] out, int offset, int length);/*{
|
||||
static native void getElementsS(long inst, short[] out, int offset, int length);/*{
|
||||
const TESSindex* elements = tessGetElements((TESStesselator*) inst);
|
||||
for(int i = 0; i < length; i++)
|
||||
out[i] = (short)elements[offset++];
|
||||
}*/
|
||||
|
||||
/**
|
||||
* Returns list of triangles indices (or to the first element of convex polygons).
|
||||
* Returns list of triangles indices (or to the first element of convex polygons).
|
||||
*/
|
||||
private static native void getElementsWithInputVertexIds(long inst, short[] out, int dstOffset, int offset, int length);/*{
|
||||
static native void getElementsWithInputVertexIds(long inst, short[] out, int dstOffset, int offset, int length);/*{
|
||||
const TESSindex* elements = tessGetElements((TESStesselator*) inst);
|
||||
const TESSindex* indices = tessGetVertexIndices((TESStesselator*) inst);
|
||||
|
||||
for(int i = 0; i < length; i++)
|
||||
out[dstOffset++] = (short)indices[elements[offset++]];
|
||||
out[dstOffset++] = (short)(indices[elements[offset++]]);
|
||||
}*/
|
||||
|
||||
//@formatter:on
|
||||
public static void main(String[] args) throws Exception {
|
||||
System.load(new File("libs/linux64/libvtm-jni64.so").getAbsolutePath());
|
||||
Tesselator tess = new Tesselator();
|
||||
|
||||
float[] c1 = new float[] {
|
||||
0, 0,
|
||||
4, 0,
|
||||
4, 4,
|
||||
0, 4,
|
||||
};
|
||||
|
||||
float[] c2 = new float[] {
|
||||
1, 1,
|
||||
1, 2,
|
||||
2, 2,
|
||||
2, 1
|
||||
};
|
||||
|
||||
float[] c3 = new float[] {
|
||||
0, 0,
|
||||
4, 0,
|
||||
4, 4,
|
||||
0, 4,
|
||||
|
||||
1, 1,
|
||||
1, 2,
|
||||
2, 2,
|
||||
2, 1
|
||||
};
|
||||
|
||||
int polySize = 3;
|
||||
|
||||
addContour(tess.inst, 2, c1, 8, 0, c1.length / 2);
|
||||
|
||||
//addContour(tess.inst, 2, c2, 8, c2.length / 2);
|
||||
|
||||
//addContour(tess.inst, 2, c3, 8, c3.length / 2);
|
||||
|
||||
//int[] index = { 8, 8, -1 };
|
||||
|
||||
//addMultiContour2D(tess.inst, index, c3, 0, 4);
|
||||
out.println("yup");
|
||||
|
||||
tessContour2D(tess.inst,
|
||||
WindingRule.POSITIVE,
|
||||
ElementType.POLYGONS,
|
||||
polySize, 2);
|
||||
|
||||
out.println("y0!");
|
||||
|
||||
int nElem = getElementCount(tess.inst);
|
||||
int nVert = getVertexCount(tess.inst);
|
||||
|
||||
out.println(nVert + "/" + nElem);
|
||||
|
||||
short[] elems = new short[nElem * polySize];
|
||||
getElementsS(tess.inst, elems, 0, nElem * polySize);
|
||||
|
||||
out.println(Arrays.toString(elems));
|
||||
|
||||
int half = nElem * polySize / 2;
|
||||
elems = new short[half];
|
||||
getElementsS(tess.inst, elems, half, half);
|
||||
|
||||
out.println(Arrays.toString(elems));
|
||||
|
||||
float[] verts = new float[nVert * 2];
|
||||
getVertices(tess.inst, verts, 0, nVert * 2);
|
||||
|
||||
out.println(Arrays.toString(verts));
|
||||
|
||||
short[] ids = new short[nElem * polySize];
|
||||
getElementsWithInputVertexIds(tess.inst, ids, 0, 0, ids.length);
|
||||
|
||||
out.println(Arrays.toString(ids));
|
||||
|
||||
for (int i = 0; i < nElem * polySize; i++) {
|
||||
out.println(c3[ids[i] * 2] + ", " + c3[ids[i] * 2 + 1]);
|
||||
}
|
||||
out.println();
|
||||
|
||||
freeTess(tess.inst);
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user