#ifndef COMMON_MULTI_BODY_SETUP_H #define COMMON_MULTI_BODY_SETUP_H #include "../CommonInterfaces/CommonExampleInterface.h" #include "../CommonInterfaces/CommonGUIHelperInterface.h" #include "../CommonInterfaces/CommonRenderInterface.h" #include "../CommonInterfaces/CommonGraphicsAppInterface.h" #include "../CommonInterfaces/CommonWindowInterface.h" #include "../CommonInterfaces/CommonCameraInterface.h" #include "GpuDemoInternalData.h" #include "Bullet3Common/b3Scalar.h" #include "Bullet3OpenCL/Initialize/b3OpenCLUtils.h" struct CommonOpenCLBase : public CommonExampleInterface { struct GUIHelperInterface* m_guiHelper; struct GpuDemoInternalData* m_clData; CommonOpenCLBase(GUIHelperInterface* helper) : m_guiHelper(helper), m_clData(0) { m_clData = new GpuDemoInternalData(); } virtual ~CommonOpenCLBase() { delete m_clData; m_clData = 0; } virtual void stepSimulation(float deltaTime) { } virtual void initCL(int preferredDeviceIndex, int preferredPlatformIndex) { // void* glCtx=0; // void* glDC = 0; int ciErrNum = 0; cl_device_type deviceType = CL_DEVICE_TYPE_GPU; //if (gAllowCpuOpenCL) // deviceType = CL_DEVICE_TYPE_ALL; // if (useInterop) // { // m_data->m_clContext = b3OpenCLUtils::createContextFromType(deviceType, &ciErrNum, glCtx, glDC); // } else { m_clData->m_clContext = b3OpenCLUtils::createContextFromType(deviceType, &ciErrNum, 0, 0, preferredDeviceIndex, preferredPlatformIndex, &m_clData->m_platformId); } oclCHECKERROR(ciErrNum, CL_SUCCESS); int numDev = b3OpenCLUtils::getNumDevices(m_clData->m_clContext); if (numDev > 0) { m_clData->m_clDevice = b3OpenCLUtils::getDevice(m_clData->m_clContext, 0); m_clData->m_clQueue = clCreateCommandQueue(m_clData->m_clContext, m_clData->m_clDevice, 0, &ciErrNum); oclCHECKERROR(ciErrNum, CL_SUCCESS); b3OpenCLDeviceInfo info; b3OpenCLUtils::getDeviceInfo(m_clData->m_clDevice, &info); m_clData->m_clDeviceName = info.m_deviceName; m_clData->m_clInitialized = true; } } virtual void exitCL() { if (m_clData && m_clData->m_clInitialized) { clReleaseCommandQueue(m_clData->m_clQueue); clReleaseContext(m_clData->m_clContext); m_clData->m_clInitialized = false; } } virtual void renderScene() { if (m_guiHelper->getRenderInterface()) { m_guiHelper->getRenderInterface()->renderScene(); } } virtual void physicsDebugDraw(int debugDrawFlags) { } virtual bool keyboardCallback(int key, int state) { return false; //don't handle this key } virtual bool mouseMoveCallback(float x, float y) { return false; } virtual bool mouseButtonCallback(int button, int state, float x, float y) { CommonRenderInterface* renderer = m_guiHelper->getRenderInterface(); if (!renderer) { b3Assert(0); return false; } CommonWindowInterface* window = m_guiHelper->getAppInterface()->m_window; if (state == 1) { if (button == 0 && (!window->isModifierKeyPressed(B3G_ALT) && !window->isModifierKeyPressed(B3G_CONTROL))) { /*btVector3 camPos; renderer->getActiveCamera()->getCameraPosition(camPos); btVector3 rayFrom = camPos; btVector3 rayTo = getRayTo(int(x),int(y)); pickBody(rayFrom, rayTo); */ } } else { if (button == 0) { // removePickingConstraint(); //remove p2p } } //printf("button=%d, state=%d\n",button,state); return false; } }; #endif //COMMON_MULTI_BODY_SETUP_H