mirror of
https://github.com/OpenFOAM/ThirdParty-6.git
synced 2025-12-08 06:57:43 +00:00
226 lines
6.9 KiB
C++
226 lines
6.9 KiB
C++
/*=========================================================================
|
|
|
|
Program: Visualization Toolkit
|
|
|
|
Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen
|
|
All rights reserved.
|
|
See Copyright.txt or http://www.kitware.com/Copyright.htm for details.
|
|
|
|
This software is distributed WITHOUT ANY WARRANTY; without even
|
|
the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
|
|
PURPOSE. See the above copyright notice for more information.
|
|
|
|
=========================================================================*/
|
|
/*
|
|
* Copyright (C) 2010 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 <errno.h>
|
|
#include <sstream>
|
|
|
|
#include "vtkNew.h"
|
|
|
|
#include "vtkActor.h"
|
|
#include "vtkCamera.h"
|
|
#include "vtkConeSource.h"
|
|
#include "vtkDebugLeaks.h"
|
|
#include "vtkGlyph3D.h"
|
|
#include "vtkPolyData.h"
|
|
#include "vtkPolyDataMapper.h"
|
|
#include "vtkRenderWindow.h"
|
|
#include "vtkRenderer.h"
|
|
#include "vtkSphereSource.h"
|
|
#include "vtkTextActor.h"
|
|
#include "vtkTextProperty.h"
|
|
|
|
#include "vtkAndroidRenderWindowInteractor.h"
|
|
#include "vtkCommand.h"
|
|
|
|
#include <android/log.h>
|
|
|
|
#define LOGI(...) ((void)__android_log_print(ANDROID_LOG_INFO, "NativeVTK", __VA_ARGS__))
|
|
#define LOGW(...) ((void)__android_log_print(ANDROID_LOG_WARN, "NativeVTK", __VA_ARGS__))
|
|
|
|
extern "C" {
|
|
JNIEXPORT jlong JNICALL Java_com_kitware_JavaVTK_JavaVTKLib_init(JNIEnv * env, jobject obj, jint width, jint height);
|
|
JNIEXPORT void JNICALL Java_com_kitware_JavaVTK_JavaVTKLib_render(JNIEnv * env, jobject obj, jlong renWinP);
|
|
JNIEXPORT void JNICALL Java_com_kitware_JavaVTK_JavaVTKLib_onKeyEvent(JNIEnv * env, jobject obj, jlong udp,
|
|
jboolean down, jint keyCode, jint metaState, jint repeatCount
|
|
);
|
|
JNIEXPORT void JNICALL Java_com_kitware_JavaVTK_JavaVTKLib_onMotionEvent(JNIEnv * env, jobject obj, jlong udp,
|
|
jint action,
|
|
jint eventPointer,
|
|
jint numPtrs,
|
|
jfloatArray xPos, jfloatArray yPos,
|
|
jintArray ids, jint metaState);
|
|
};
|
|
|
|
struct userData
|
|
{
|
|
vtkRenderWindow *RenderWindow;
|
|
vtkRenderer *Renderer;
|
|
vtkAndroidRenderWindowInteractor *Interactor;
|
|
};
|
|
|
|
// Example of updating text as we go
|
|
class vtkExampleCallback : public vtkCommand
|
|
{
|
|
public:
|
|
static vtkExampleCallback *New()
|
|
{ return new vtkExampleCallback; }
|
|
virtual void Execute( vtkObject *caller, unsigned long, void* )
|
|
{
|
|
// Update cardinality of selection
|
|
double *pos = this->Camera->GetPosition();
|
|
std::ostringstream txt;
|
|
txt << "Camera positioned at: "
|
|
<< std::fixed
|
|
<< std::setprecision( 2 )
|
|
<< std::setw( 6 )
|
|
<< pos[0] << ", "
|
|
<< std::setw( 6 )
|
|
<< pos[1] << ", "
|
|
<< std::setw( 6 )
|
|
<< pos[2];
|
|
this->Text->SetInput( txt.str().c_str() );
|
|
}
|
|
|
|
vtkExampleCallback()
|
|
{
|
|
this->Camera = 0;
|
|
this->Text = 0;
|
|
}
|
|
|
|
vtkCamera *Camera;
|
|
vtkTextActor* Text;
|
|
};
|
|
|
|
/*
|
|
* Here is where you would setup your pipeline and other normal VTK logic
|
|
*/
|
|
JNIEXPORT jlong JNICALL Java_com_kitware_JavaVTK_JavaVTKLib_init(JNIEnv * env, jobject obj, jint width, jint height)
|
|
{
|
|
vtkRenderWindow *renWin = vtkRenderWindow::New();
|
|
char jniS[4] = {'j','n','i',0};
|
|
renWin->SetWindowInfo(jniS); // tell the system that jni owns the window not us
|
|
renWin->SetSize(width,height);
|
|
vtkNew<vtkRenderer> renderer;
|
|
renWin->AddRenderer(renderer.Get());
|
|
|
|
vtkNew<vtkAndroidRenderWindowInteractor> iren;
|
|
iren->SetRenderWindow(renWin);
|
|
|
|
vtkNew<vtkSphereSource> sphere;
|
|
sphere->SetThetaResolution(8);
|
|
sphere->SetPhiResolution(8);
|
|
|
|
vtkNew<vtkPolyDataMapper> sphereMapper;
|
|
sphereMapper->SetInputConnection(sphere->GetOutputPort());
|
|
vtkNew<vtkActor> sphereActor;
|
|
sphereActor->SetMapper(sphereMapper.Get());
|
|
|
|
vtkNew<vtkConeSource> cone;
|
|
cone->SetResolution(6);
|
|
|
|
vtkNew<vtkGlyph3D> glyph;
|
|
glyph->SetInputConnection(sphere->GetOutputPort());
|
|
glyph->SetSourceConnection(cone->GetOutputPort());
|
|
glyph->SetVectorModeToUseNormal();
|
|
glyph->SetScaleModeToScaleByVector();
|
|
glyph->SetScaleFactor(0.25);
|
|
|
|
vtkNew<vtkPolyDataMapper> spikeMapper;
|
|
spikeMapper->SetInputConnection(glyph->GetOutputPort());
|
|
|
|
vtkNew<vtkActor> spikeActor;
|
|
spikeActor->SetMapper(spikeMapper.Get());
|
|
|
|
renderer->AddActor(sphereActor.Get());
|
|
renderer->AddActor(spikeActor.Get());
|
|
renderer->SetBackground(0.4,0.5,0.6);
|
|
|
|
vtkNew<vtkTextActor> ta;
|
|
ta->SetInput("Droids Rock");
|
|
ta->GetTextProperty()->SetColor( 0.5, 1.0, 0.0 );
|
|
ta->SetDisplayPosition(50,50);
|
|
ta->GetTextProperty()->SetFontSize(32);
|
|
renderer->AddActor(ta.Get());
|
|
|
|
vtkNew<vtkExampleCallback> cb;
|
|
cb->Camera = renderer->GetActiveCamera();
|
|
cb->Text = ta.Get();
|
|
iren->AddObserver( vtkCommand::InteractionEvent, cb.Get() );
|
|
|
|
struct userData *foo = new struct userData();
|
|
foo->RenderWindow = renWin;
|
|
foo->Renderer = renderer.Get();
|
|
foo->Interactor = iren.Get();
|
|
|
|
return (jlong)foo;
|
|
}
|
|
|
|
JNIEXPORT void JNICALL Java_com_kitware_JavaVTK_JavaVTKLib_render(JNIEnv * env, jobject obj, jlong udp)
|
|
{
|
|
struct userData *foo = (userData *)(udp);
|
|
foo->RenderWindow->SwapBuffersOff(); // android does it
|
|
foo->RenderWindow->Render();
|
|
foo->RenderWindow->SwapBuffersOn(); // reset
|
|
}
|
|
|
|
JNIEXPORT void JNICALL Java_com_kitware_JavaVTK_JavaVTKLib_onKeyEvent(JNIEnv * env, jobject obj, jlong udp,
|
|
jboolean down, jint keyCode, jint metaState, jint repeatCount)
|
|
{
|
|
struct userData *foo = (userData *)(udp);
|
|
foo->Interactor->HandleKeyEvent(down, keyCode, metaState, repeatCount);
|
|
}
|
|
|
|
JNIEXPORT void JNICALL Java_com_kitware_JavaVTK_JavaVTKLib_onMotionEvent(JNIEnv * env, jobject obj, jlong udp,
|
|
jint action,
|
|
jint eventPointer,
|
|
jint numPtrs,
|
|
jfloatArray xPos, jfloatArray yPos,
|
|
jintArray ids, jint metaState)
|
|
{
|
|
struct userData *foo = (userData *)(udp);
|
|
|
|
int xPtr[VTKI_MAX_POINTERS];
|
|
int yPtr[VTKI_MAX_POINTERS];
|
|
int idPtr[VTKI_MAX_POINTERS];
|
|
|
|
// only allow VTKI_MAX_POINTERS touches right now
|
|
if (numPtrs > VTKI_MAX_POINTERS)
|
|
{
|
|
numPtrs = VTKI_MAX_POINTERS;
|
|
}
|
|
|
|
// fill in the arrays
|
|
jfloat *xJPtr = env->GetFloatArrayElements(xPos, 0);
|
|
jfloat *yJPtr = env->GetFloatArrayElements(yPos, 0);
|
|
jint *idJPtr = env->GetIntArrayElements(ids, 0);
|
|
for (int i = 0; i < numPtrs; ++i)
|
|
{
|
|
xPtr[i] = (int)xJPtr[i];
|
|
yPtr[i] = (int)yJPtr[i];
|
|
idPtr[i] = idJPtr[i];
|
|
}
|
|
env->ReleaseIntArrayElements(ids, idJPtr, 0);
|
|
env->ReleaseFloatArrayElements(xPos, xJPtr, 0);
|
|
env->ReleaseFloatArrayElements(yPos, yJPtr, 0);
|
|
|
|
foo->Interactor->HandleMotionEvent(action, eventPointer, numPtrs, xPtr, yPtr, idPtr, metaState);
|
|
}
|