summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorerwincoumans <erwin.coumans@gmail.com>2018-09-09 13:37:49 -0700
committererwincoumans <erwin.coumans@gmail.com>2018-09-09 13:37:49 -0700
commitadb5c049c767a820b7cb9a32a5629c8e28033a8c (patch)
treec0fee784bfe4705af8b220533af6574d818e36b2
parentdc7feb9027440fd90260e12d991b7b1987c8f07a (diff)
downloadbullet3-adb5c049c767a820b7cb9a32a5629c8e28033a8c.tar.gz
Thanks to @dchichkov for some of the fixes in the eglRendererPlugin!
Rename tinyRenderer -> eglRenderer in the eglRendererPlugin. Allow to run the eglRendererPlugin to run on Windows (not in EGL mode but Win32OpenGLWindow mode) Here is a script I tested on Windows: ~~~~~~~~~~~~ mport pybullet as p import time p.connect(p.DIRECT) plugin = p.loadPlugin("e:/develop/bullet3/bin/pybullet_eglRendererPlugin_vs2010_x64_debug.dll","_eglRendererPlugin") print("plugin=",plugin) p.setGravity(0,0,-10) p.loadURDF("plane.urdf",[0,0,-1]) p.loadURDF("r2d2.urdf") pixelWidth = 320 pixelHeight = 220 while (1): p.stepSimulation() viewMatrix = [1.0, 0.0, -0.0, 0.0, -0.0, 0.1736481785774231, -0.9848078489303589, 0.0, 0.0, 0.9848078489303589, 0.1736481785774231, 0.0, -0.0, -5.960464477539063e-08, -4.0, 1.0] projectionMatrix = [1.0825318098068237, 0.0, 0.0, 0.0, 0.0, 1.732050895690918, 0.0, 0.0, 0.0, 0.0, -1.0002000331878662, -1.0, 0.0, 0.0, -0.020002000033855438, 0.0] #img_arr = p.getCameraImage(pixelWidth, pixelHeight, viewMatrix,projectionMatrix, shadow=1,lightDirection=[1,1,1])#,renderer=pybullet.ER_BULLET_HARDWARE_OPENGL) img_arr = p.getCameraImage(pixelWidth, pixelHeight, shadow=1,lightDirection=[1,1,1])#,renderer=pybullet.ER_BULLET_HARDWARE_OPENGL) #print("img_arr=",img_arr) time.sleep(1) ~~~~~~~~~~~~~
-rw-r--r--build3/premake4.lua15
-rw-r--r--build_visual_studio_vr_pybullet_double.bat9
-rw-r--r--examples/OpenGLWindow/EGLOpenGLWindow.cpp11
-rw-r--r--examples/SharedMemory/plugins/eglPlugin/bullet.py85
-rw-r--r--examples/SharedMemory/plugins/eglPlugin/eglRendererPlugin.cpp36
-rw-r--r--examples/SharedMemory/plugins/eglPlugin/eglRendererPlugin.h14
-rw-r--r--examples/SharedMemory/plugins/eglPlugin/eglRendererVisualShapeConverter.cpp123
-rw-r--r--examples/SharedMemory/plugins/eglPlugin/eglRendererVisualShapeConverter.h11
-rw-r--r--examples/SharedMemory/plugins/eglPlugin/premake4.lua37
-rw-r--r--examples/SharedMemory/premake4.lua4
10 files changed, 160 insertions, 185 deletions
diff --git a/build3/premake4.lua b/build3/premake4.lua
index 69f0c1275..95d54a0ae 100644
--- a/build3/premake4.lua
+++ b/build3/premake4.lua
@@ -73,6 +73,14 @@
description = "Use Midi controller to control parameters"
}
+
+ newoption
+ {
+ trigger = "enable_egl",
+ description = "Build an experimental eglPlugin"
+ }
+
+
newoption
{
trigger = "enable_grpc",
@@ -145,6 +153,13 @@
_OPTIONS["protobuf_lib_dir"] = default_protobuf_lib_dir
end
+
+ if _OPTIONS["enable_egl"] then
+ function initEGL()
+ defines {"BT_USE_EGL"}
+ end
+ end
+
if _OPTIONS["enable_grpc"] then
function initGRPC()
diff --git a/build_visual_studio_vr_pybullet_double.bat b/build_visual_studio_vr_pybullet_double.bat
index a5b824826..e3e8a4dc5 100644
--- a/build_visual_studio_vr_pybullet_double.bat
+++ b/build_visual_studio_vr_pybullet_double.bat
@@ -12,16 +12,17 @@ set /p myvar1= < tmp1234.txt
set myvar=c:/%myvar1%
del tmp1234.txt
-#you can also override and hardcode the Python path like this (just remove the # hashmark in next line)
-#SET myvar=c:\python-3.5.2
+rem you can also override and hardcode the Python path like this (just remove the # hashmark in next line)
+rem SET myvar=c:\python-3.5.2
cd build3
premake4 --double --enable_multithreading --midi --enable_static_vr_plugin --enable_openvr --enable_pybullet --python_include_dir="%myvar%/include" --python_lib_dir="%myvar%/libs" --targetdir="../bin" vs2010
-#premake4 --double --grpc --enable_multithreading --midi --enable_static_vr_plugin --enable_openvr --enable_pybullet --python_include_dir="%myvar%/include" --python_lib_dir="%myvar%/libs" --targetdir="../binserver" vs2010
-#premake4 --serial --audio --double --midi --enable_openvr --enable_pybullet --python_include_dir="%myvar%/include" --python_lib_dir="%myvar%/libs" --targetdir="../bin" vs2010
+rem premake4 --double --enable_multithreading --midi --enable_static_vr_plugin --enable_openvr --enable_pybullet --python_include_dir="%myvar%/include" --python_lib_dir="%myvar%/libs" --targetdir="../binserver" vs2010
+rem premake4 --double --enable_grpc --enable_multithreading --midi --enable_static_vr_plugin --enable_openvr --enable_pybullet --python_include_dir="%myvar%/include" --python_lib_dir="%myvar%/libs" --targetdir="../binserver" vs2010
+rem premake4 --serial --audio --double --midi --enable_openvr --enable_pybullet --python_include_dir="%myvar%/include" --python_lib_dir="%myvar%/libs" --targetdir="../bin" vs2010
start vs2010
diff --git a/examples/OpenGLWindow/EGLOpenGLWindow.cpp b/examples/OpenGLWindow/EGLOpenGLWindow.cpp
index ec7fea20b..f2f12c92b 100644
--- a/examples/OpenGLWindow/EGLOpenGLWindow.cpp
+++ b/examples/OpenGLWindow/EGLOpenGLWindow.cpp
@@ -30,11 +30,12 @@
#ifdef BT_USE_EGL
-#include <pthread.h>
+
+
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
-#include <unistd.h>
+
#include "OpenGLInclude.h"
@@ -213,7 +214,7 @@ void EGLOpenGLWindow::createWindow(const b3gWindowConstructionInfo& ci) {
exit(EXIT_FAILURE);
}
- if (!gladLoadGL(eglGetProcAddress)) {
+ if (!gladLoadGL((GLADloadfunc) eglGetProcAddress)) {
fprintf(stderr, "failed to load GL with glad.\n");
exit(EXIT_FAILURE);
}
@@ -228,8 +229,8 @@ void EGLOpenGLWindow::createWindow(const b3gWindowConstructionInfo& ci) {
const GLubyte* sl = glGetString(GL_SHADING_LANGUAGE_VERSION);
printf("GL_SHADING_LANGUAGE_VERSION=%s\n", sl);
- int i = pthread_getconcurrency();
- printf("pthread_getconcurrency()=%d\n", i);
+ //int i = pthread_getconcurrency();
+ //printf("pthread_getconcurrency()=%d\n", i);
}
void EGLOpenGLWindow::closeWindow() {
diff --git a/examples/SharedMemory/plugins/eglPlugin/bullet.py b/examples/SharedMemory/plugins/eglPlugin/bullet.py
deleted file mode 100644
index 038061c9c..000000000
--- a/examples/SharedMemory/plugins/eglPlugin/bullet.py
+++ /dev/null
@@ -1,85 +0,0 @@
-import os
-import sys
-import time
-import subprocess
-import pybullet as p
-from pdb import set_trace
-import matplotlib.pyplot as plt
-import numpy as np
-#subprocess.call(["hardening-check", p.__file__])
-
-
-
-p.connect(p.DIRECT)
-logId = p.startStateLogging(p.STATE_LOGGING_PROFILE_TIMINGS, "debugTimings")
-
-plugin = True
-if plugin:
- plugin_fn = '/home/argusm/lang/bullet3/build/lib.linux-x86_64-3.5/eglRenderer.cpython-35m-x86_64-linux-gnu.so'
- plugin = p.loadPlugin(plugin_fn,"_tinyRendererPlugin")
- if plugin < 0:
- print("\nPlugin Failed to load!\n")
- sys.exit()
- print("plugin =",plugin)
-
-path = '/home/argusm/lang/bullet3/examples/pybullet/gym/pybullet_data/duck_vhacd.urdf'
-p.loadURDF(path,globalScaling=12)
-#path = '/home/argusm/lang/gym-grasping/gym_grasping/robots/models/kuka_iiwa/kuka_weiss_bolt.sdf'
-#p.loadSDF(path)
-
-start = time.time()
-
-camTargetPos = [0,0,0]
-upAxisIndex = 2
-nearPlane = 0.01
-farPlane = 100
-camDistance = 2
-pixelWidth = 128
-pixelHeight = 128
-fov = 60
-
-plot = False
-anim = True
-if plot:
- plt.ion()
-if anim:
- import matplotlib.animation as manimation
- FFMpegWriter = manimation.writers['ffmpeg']
- metadata = dict(title='Movie Test', artist='Matplotlib',
- comment='Movie support!')
- writer = FFMpegWriter(fps=15, metadata=metadata)
-if plot or anim:
- fig = plt.figure()
- img = np.random.rand(pixelWidth,pixelHeight)
- image = plt.imshow(img,interpolation='none',animated=True,label="blah")
- ax = plt.gca()
- ax.set_axis_off()
- ax.set_aspect('equal')
- plt.subplots_adjust(wspace=0, hspace=0, left=0, bottom=0, right=1, top=1)
-
-
-try:
- iter = range(0,360,10)
- with writer.saving(fig, "debug.mp4", len(iter)):
- for i,yaw in enumerate(iter):
- viewMatrix = p.computeViewMatrixFromYawPitchRoll(camTargetPos, camDistance, 0, yaw-90, 0, upAxisIndex)
- aspect = pixelWidth / pixelHeight;
- projectionMatrix = p.computeProjectionMatrixFOV(fov, aspect, nearPlane, farPlane);
-
- hight, width, img_arr, deept_arr, obj_arr = p.getCameraImage(pixelWidth,pixelHeight,viewMatrix,projectionMatrix)
- if plot:
- image.set_data(img_arr)#np_img_arr)
- ax.plot([0])
- #plt.draw()
- #plt.show()
- plt.pause(0.01)
- if anim:
- image.set_data(img_arr)#np_img_arr)
- ax.plot([0])
- writer.grab_frame()
-
- if i % 100 == 0 and i > 0:
- print("FPS",100/(time.time()-start))
- start = time.time()
-finally:
- p.stopStateLogging(logId)
diff --git a/examples/SharedMemory/plugins/eglPlugin/eglRendererPlugin.cpp b/examples/SharedMemory/plugins/eglPlugin/eglRendererPlugin.cpp
index b90ae3c2c..3ca472901 100644
--- a/examples/SharedMemory/plugins/eglPlugin/eglRendererPlugin.cpp
+++ b/examples/SharedMemory/plugins/eglPlugin/eglRendererPlugin.cpp
@@ -1,15 +1,7 @@
-//tinyRenderer plugin
-
-/*
-import pybullet as p
-p.connect(p.GUI)
-plugin = p.loadPlugin("e:/develop/bullet3/bin/pybullet_tinyRendererPlugin_vs2010_x64_debug.dll","_tinyRendererPlugin")
-print("plugin=",plugin)
-p.loadURDF("r2d2.urdf")
-while (1):
- p.getCameraImage(320,200)
-*/
+//eglRenderer plugin
+
+//see Bullet/examples/pybullet/examples/eglRendererTest.py
#include "eglRendererPlugin.h"
#include "eglRendererVisualShapeConverter.h"
@@ -20,43 +12,43 @@ while (1):
-struct MyRendererPluginClass
+struct EGLRendererPluginClass
{
- TinyRendererVisualShapeConverter m_renderer;
- MyRendererPluginClass()
+ EGLRendererVisualShapeConverter m_renderer;
+ EGLRendererPluginClass()
{
}
- virtual ~MyRendererPluginClass()
+ virtual ~EGLRendererPluginClass()
{
}
};
-B3_SHARED_API int initPlugin_tinyRendererPlugin(struct b3PluginContext* context)
+B3_SHARED_API int initPlugin_eglRendererPlugin(struct b3PluginContext* context)
{
- MyRendererPluginClass* obj = new MyRendererPluginClass();
+ EGLRendererPluginClass* obj = new EGLRendererPluginClass();
context->m_userPointer = obj;
return SHARED_MEMORY_MAGIC_NUMBER;
}
-B3_SHARED_API int executePluginCommand_tinyRendererPlugin(struct b3PluginContext* context, const struct b3PluginArguments* arguments)
+B3_SHARED_API int executePluginCommand_eglRendererPlugin(struct b3PluginContext* context, const struct b3PluginArguments* arguments)
{
return -1;
}
-B3_SHARED_API void exitPlugin_tinyRendererPlugin(struct b3PluginContext* context)
+B3_SHARED_API void exitPlugin_eglRendererPlugin(struct b3PluginContext* context)
{
- MyRendererPluginClass* obj = (MyRendererPluginClass*) context->m_userPointer;
+ EGLRendererPluginClass* obj = (EGLRendererPluginClass*) context->m_userPointer;
delete obj;
context->m_userPointer = 0;
}
//all the APIs below are optional
-B3_SHARED_API struct UrdfRenderingInterface* getRenderInterface_tinyRendererPlugin(struct b3PluginContext* context)
+B3_SHARED_API struct UrdfRenderingInterface* getRenderInterface_eglRendererPlugin(struct b3PluginContext* context)
{
- MyRendererPluginClass* obj = (MyRendererPluginClass*) context->m_userPointer;
+ EGLRendererPluginClass* obj = (EGLRendererPluginClass*) context->m_userPointer;
return &obj->m_renderer;
}
diff --git a/examples/SharedMemory/plugins/eglPlugin/eglRendererPlugin.h b/examples/SharedMemory/plugins/eglPlugin/eglRendererPlugin.h
index 9f1d9330a..bc010d2c9 100644
--- a/examples/SharedMemory/plugins/eglPlugin/eglRendererPlugin.h
+++ b/examples/SharedMemory/plugins/eglPlugin/eglRendererPlugin.h
@@ -1,5 +1,5 @@
-#ifndef TINY_RENDERER_PLUGIN_H
-#define TINY_RENDERER_PLUGIN_H
+#ifndef EGL_RENDERER_PLUGIN_H
+#define EGL_RENDERER_PLUGIN_H
#include "../b3PluginAPI.h"
@@ -9,12 +9,12 @@ extern "C"
#endif
//initPlugin, exitPlugin and executePluginCommand are required, otherwise plugin won't load
-B3_SHARED_API int initPlugin_tinyRendererPlugin(struct b3PluginContext* context);
-B3_SHARED_API void exitPlugin_tinyRendererPlugin(struct b3PluginContext* context);
-B3_SHARED_API int executePluginCommand_tinyRendererPlugin(struct b3PluginContext* context, const struct b3PluginArguments* arguments);
+B3_SHARED_API int initPlugin_eglRendererPlugin(struct b3PluginContext* context);
+B3_SHARED_API void exitPlugin_eglRendererPlugin(struct b3PluginContext* context);
+B3_SHARED_API int executePluginCommand_eglRendererPlugin(struct b3PluginContext* context, const struct b3PluginArguments* arguments);
//all the APIs below are optional
-B3_SHARED_API struct UrdfRenderingInterface* getRenderInterface_tinyRendererPlugin(struct b3PluginContext* context);
+B3_SHARED_API struct UrdfRenderingInterface* getRenderInterface_eglRendererPlugin(struct b3PluginContext* context);
@@ -22,4 +22,4 @@ B3_SHARED_API struct UrdfRenderingInterface* getRenderInterface_tinyRendererPlug
};
#endif
-#endif//#define TEST_PLUGIN_H
+#endif//#define EGL_RENDERER_PLUGIN_H
diff --git a/examples/SharedMemory/plugins/eglPlugin/eglRendererVisualShapeConverter.cpp b/examples/SharedMemory/plugins/eglPlugin/eglRendererVisualShapeConverter.cpp
index 60c248b24..ce657d8bd 100644
--- a/examples/SharedMemory/plugins/eglPlugin/eglRendererVisualShapeConverter.cpp
+++ b/examples/SharedMemory/plugins/eglPlugin/eglRendererVisualShapeConverter.cpp
@@ -38,9 +38,16 @@ subject to the following restrictions:
#include "stb_image/stb_image.h"
-#include "../OpenGLWindow/EGLOpenGLWindow.h"
-#include "../OpenGLWindow/GLInstancingRenderer.h"
-#include "../OpenGLWindow/GLRenderToTexture.h"
+#ifdef _WIN32
+#include "OpenGLWindow/Win32OpenGLWindow.h"
+typedef Win32OpenGLWindow DefaultOpenGLWindow;
+#else
+#include "OpenGLWindow/EGLOpenGLWindow.h"
+typedef EGLOpenGLWindow DefaultOpenGLWindow;
+#endif
+
+#include "OpenGLWindow/GLInstancingRenderer.h"
+#include "OpenGLWindow/GLRenderToTexture.h"
static void printGLString(const char *name, GLenum s) {
const char *v = (const char *) glGetString(s);
@@ -62,6 +69,7 @@ struct TinyRendererObjectArray
btAlignedObjectArray< TinyRenderObjectData*> m_renderObjects;
int m_objectUniqueId;
int m_linkIndex;
+ int m_graphicsInstanceId;
btTransform m_worldTransform;
btVector3 m_localScaling;
@@ -69,13 +77,14 @@ struct TinyRendererObjectArray
{
m_worldTransform.setIdentity();
m_localScaling.setValue(1,1,1);
+ m_graphicsInstanceId = -1;
}
};
#define START_WIDTH 640
#define START_HEIGHT 480
-struct TinyRendererVisualShapeConverterInternalData
+struct EGLRendererVisualShapeConverterInternalData
{
class CommonWindowInterface* m_window;
class GLInstancingRenderer* m_instancingRenderer;
@@ -111,7 +120,7 @@ struct TinyRendererVisualShapeConverterInternalData
SimpleCamera m_camera;
- TinyRendererVisualShapeConverterInternalData()
+ EGLRendererVisualShapeConverterInternalData()
:m_upAxis(2),
m_swWidth(START_WIDTH),
m_swHeight(START_HEIGHT),
@@ -137,7 +146,7 @@ struct TinyRendererVisualShapeConverterInternalData
// OpenGL window
bool allowRetina=true;
- m_window = new EGLOpenGLWindow();
+ m_window = new DefaultOpenGLWindow();
m_window->setAllowRetina(allowRetina);
b3gWindowConstructionInfo ci;
ci.m_title = "Title";
@@ -177,9 +186,9 @@ struct TinyRendererVisualShapeConverterInternalData
-TinyRendererVisualShapeConverter::TinyRendererVisualShapeConverter()
+EGLRendererVisualShapeConverter::EGLRendererVisualShapeConverter()
{
- m_data = new TinyRendererVisualShapeConverterInternalData();
+ m_data = new EGLRendererVisualShapeConverterInternalData();
float dist = 1.5;
float pitch = -10;
@@ -190,53 +199,53 @@ TinyRendererVisualShapeConverter::TinyRendererVisualShapeConverter()
}
-TinyRendererVisualShapeConverter::~TinyRendererVisualShapeConverter()
+EGLRendererVisualShapeConverter::~EGLRendererVisualShapeConverter()
{
resetAll();
delete m_data;
}
-void TinyRendererVisualShapeConverter::setLightDirection(float x, float y, float z)
+void EGLRendererVisualShapeConverter::setLightDirection(float x, float y, float z)
{
m_data->m_lightDirection.setValue(x, y, z);
m_data->m_hasLightDirection = true;
}
-void TinyRendererVisualShapeConverter::setLightColor(float x, float y, float z)
+void EGLRendererVisualShapeConverter::setLightColor(float x, float y, float z)
{
m_data->m_lightColor.setValue(x, y, z);
m_data->m_hasLightColor = true;
}
-void TinyRendererVisualShapeConverter::setLightDistance(float dist)
+void EGLRendererVisualShapeConverter::setLightDistance(float dist)
{
m_data->m_lightDistance = dist;
m_data->m_hasLightDistance = true;
}
-void TinyRendererVisualShapeConverter::setShadow(bool hasShadow)
+void EGLRendererVisualShapeConverter::setShadow(bool hasShadow)
{
m_data->m_hasShadow = hasShadow;
}
-void TinyRendererVisualShapeConverter::setFlags(int flags)
+void EGLRendererVisualShapeConverter::setFlags(int flags)
{
m_data->m_flags = flags;
}
-void TinyRendererVisualShapeConverter::setLightAmbientCoeff(float ambientCoeff)
+void EGLRendererVisualShapeConverter::setLightAmbientCoeff(float ambientCoeff)
{
m_data->m_lightAmbientCoeff = ambientCoeff;
m_data->m_hasLightAmbientCoeff = true;
}
-void TinyRendererVisualShapeConverter::setLightDiffuseCoeff(float diffuseCoeff)
+void EGLRendererVisualShapeConverter::setLightDiffuseCoeff(float diffuseCoeff)
{
m_data->m_lightDiffuseCoeff = diffuseCoeff;
m_data->m_hasLightDiffuseCoeff = true;
}
-void TinyRendererVisualShapeConverter::setLightSpecularCoeff(float specularCoeff)
+void EGLRendererVisualShapeConverter::setLightSpecularCoeff(float specularCoeff)
{
m_data->m_lightSpecularCoeff = specularCoeff;
m_data->m_hasLightSpecularCoeff = true;
@@ -609,7 +618,7 @@ static btVector4 sColors[4] =
// If you are getting segfaults in this function it may be ecause you are
// compliling the plugin with differently from pybullet, try complining the
// plugin with distutils too.
-void TinyRendererVisualShapeConverter::convertVisualShapes(
+void EGLRendererVisualShapeConverter::convertVisualShapes(
int linkIndex, const char* pathPrefix, const btTransform& localInertiaFrame,
const UrdfLink* linkPtr, const UrdfModel* model,
int collisionObjectUniqueId, int bodyUniqueId)
@@ -739,14 +748,17 @@ void TinyRendererVisualShapeConverter::convertVisualShapes(
unsigned char* textureImage1=0;
int textureWidth=0;
int textureHeight=0;
- bool isCached = false;
+ bool isCached = false;
+ int textureIndex = -1;
+
if (textures.size())
{
textureImage1 = textures[0].textureData1;
textureWidth = textures[0].m_width;
textureHeight = textures[0].m_height;
isCached = textures[0].m_isCached;
- }
+ textureIndex = m_data->m_instancingRenderer->registerTexture(textureImage1, textureWidth, textureHeight);
+ }
{
B3_PROFILE("registerMeshShape");
@@ -760,10 +772,11 @@ void TinyRendererVisualShapeConverter::convertVisualShapes(
B3_PROFILE("m_instancingRenderer register");
// register mesh to m_instancingRenderer too.
- int textureIndex = m_data->m_instancingRenderer->registerTexture(textureImage1, textureWidth, textureHeight);
- int shapeIndex = m_data->m_instancingRenderer->registerShape(&vertices[0].xyzw[0], vertices.size(), &indices[0], indices.size(),textureIndex);
+
+ int shapeIndex = m_data->m_instancingRenderer->registerShape(&vertices[0].xyzw[0], vertices.size(), &indices[0], indices.size(),B3_GL_TRIANGLES, textureIndex);
btVector3 scaling(1,1,1);
- m_data->m_instancingRenderer->registerGraphicsInstance(shapeIndex, &visualShape.m_localVisualFrame[0], &visualShape.m_localVisualFrame[3], &visualShape.m_rgbaColor[0],scaling);
+ visuals->m_graphicsInstanceId = m_data->m_instancingRenderer->registerGraphicsInstance(shapeIndex, &visualShape.m_localVisualFrame[0], &visualShape.m_localVisualFrame[3], &visualShape.m_rgbaColor[0],scaling);
+
m_data->m_instancingRenderer->writeTransforms();
}
}
@@ -778,7 +791,7 @@ void TinyRendererVisualShapeConverter::convertVisualShapes(
}
}
-int TinyRendererVisualShapeConverter::getNumVisualShapes(int bodyUniqueId)
+int EGLRendererVisualShapeConverter::getNumVisualShapes(int bodyUniqueId)
{
int start = -1;
//find first one, then count how many
@@ -810,7 +823,7 @@ int TinyRendererVisualShapeConverter::getNumVisualShapes(int bodyUniqueId)
return count;
}
-int TinyRendererVisualShapeConverter::getVisualShapesData(int bodyUniqueId, int shapeIndex, struct b3VisualShapeData* shapeData)
+int EGLRendererVisualShapeConverter::getVisualShapesData(int bodyUniqueId, int shapeIndex, struct b3VisualShapeData* shapeData)
{
int start = -1;
//find first one, then count how many
@@ -837,7 +850,7 @@ int TinyRendererVisualShapeConverter::getVisualShapesData(int bodyUniqueId, int
-void TinyRendererVisualShapeConverter::changeRGBAColor(int bodyUniqueId, int linkIndex, int shapeIndex, const double rgbaColor[4])
+void EGLRendererVisualShapeConverter::changeRGBAColor(int bodyUniqueId, int linkIndex, int shapeIndex, const double rgbaColor[4])
{
//int start = -1;
for (int i = 0; i < m_data->m_visualShapes.size(); i++)
@@ -874,7 +887,7 @@ void TinyRendererVisualShapeConverter::changeRGBAColor(int bodyUniqueId, int lin
-void TinyRendererVisualShapeConverter::setUpAxis(int axis)
+void EGLRendererVisualShapeConverter::setUpAxis(int axis)
{
m_data->m_upAxis = axis;
m_data->m_camera.setCameraUpAxis(axis);
@@ -882,7 +895,7 @@ void TinyRendererVisualShapeConverter::setUpAxis(int axis)
m_data->m_instancingRenderer->updateCamera();
}
-void TinyRendererVisualShapeConverter::resetCamera(float camDist, float yaw, float pitch, float camPosX,float camPosY, float camPosZ)
+void EGLRendererVisualShapeConverter::resetCamera(float camDist, float yaw, float pitch, float camPosX,float camPosY, float camPosZ)
{
m_data->m_camera.setCameraDistance(camDist);
m_data->m_camera.setCameraPitch(pitch);
@@ -892,7 +905,7 @@ void TinyRendererVisualShapeConverter::resetCamera(float camDist, float yaw, flo
m_data->m_camera.update();
}
-void TinyRendererVisualShapeConverter::clearBuffers(TGAColor& clearColor)
+void EGLRendererVisualShapeConverter::clearBuffers(TGAColor& clearColor)
{
float farPlane = m_data->m_camera.getCameraFrustumFar();
for(int y=0;y<m_data->m_swHeight;++y)
@@ -908,7 +921,7 @@ void TinyRendererVisualShapeConverter::clearBuffers(TGAColor& clearColor)
}
-void TinyRendererVisualShapeConverter::render()
+void EGLRendererVisualShapeConverter::render()
{
/*
ATTRIBUTE_ALIGNED16(float viewMat[16]);
@@ -920,13 +933,23 @@ void TinyRendererVisualShapeConverter::render()
cout<<viewMat[4*2 + 0]<<" "<<viewMat[4*2+1]<<" "<<viewMat[4*2+2]<<" "<<viewMat[4*2+3] << endl;
cout<<viewMat[4*3 + 0]<<" "<<viewMat[4*3+1]<<" "<<viewMat[4*3+2]<<" "<<viewMat[4*3+3] << endl;
*/
+
B3_PROFILE("m_instancingRenderer render");
- m_data->m_instancingRenderer->setActiveCamera(&m_data->m_camera);
- m_data->m_instancingRenderer->updateCamera();
+ m_data->m_instancingRenderer->writeTransforms();
+ if (m_data->m_hasLightDirection)
+ {
+ m_data->m_instancingRenderer->setLightPosition(m_data->m_lightDirection);
+ }
+ m_data->m_instancingRenderer->setActiveCamera(&m_data->m_camera);
+ m_data->m_instancingRenderer->updateCamera(m_data->m_upAxis);
+
m_data->m_instancingRenderer->renderScene();
+ m_data->m_window->endRendering();
+ m_data->m_window->startRendering();
+
}
-void TinyRendererVisualShapeConverter::render(const float viewMat[16], const float projMat[16])
+void EGLRendererVisualShapeConverter::render(const float viewMat[16], const float projMat[16])
{
// This code is very similar to that of
// PhysicsServerCommandProcessor::processRequestCameraImageCommand
@@ -934,10 +957,10 @@ void TinyRendererVisualShapeConverter::render(const float viewMat[16], const flo
// Tiny allows rendering with viewMat, projMat explicitly, but
// GLInstancingRender calls m_activeCamera, so set this.
- m_data->m_camera.setVRCamera(viewMat,projMat);
- m_data->m_instancingRenderer->setActiveCamera(&m_data->m_camera);
- m_data->m_instancingRenderer->updateCamera();
- m_data->m_instancingRenderer->renderScene();
+
+ m_data->m_camera.setVRCamera(viewMat,projMat);
+
+ render();
//cout<<viewMat[4*0 + 0]<<" "<<viewMat[4*0+1]<<" "<<viewMat[4*0+2]<<" "<<viewMat[4*0+3] << endl;
//cout<<viewMat[4*1 + 0]<<" "<<viewMat[4*1+1]<<" "<<viewMat[4*1+2]<<" "<<viewMat[4*1+3] << endl;
@@ -945,14 +968,14 @@ void TinyRendererVisualShapeConverter::render(const float viewMat[16], const flo
//cout<<viewMat[4*3 + 0]<<" "<<viewMat[4*3+1]<<" "<<viewMat[4*3+2]<<" "<<viewMat[4*3+3] << endl;
}
-void TinyRendererVisualShapeConverter::getWidthAndHeight(int& width, int& height)
+void EGLRendererVisualShapeConverter::getWidthAndHeight(int& width, int& height)
{
width = m_data->m_swWidth;
height = m_data->m_swHeight;
}
-void TinyRendererVisualShapeConverter::setWidthAndHeight(int width, int height)
+void EGLRendererVisualShapeConverter::setWidthAndHeight(int width, int height)
{
m_data->m_swWidth = width;
m_data->m_swHeight = height;
@@ -966,7 +989,7 @@ void TinyRendererVisualShapeConverter::setWidthAndHeight(int width, int height)
}
//copied from OpenGLGuiHelper.cpp
-void TinyRendererVisualShapeConverter::copyCameraImageDataGL(
+void EGLRendererVisualShapeConverter::copyCameraImageDataGL(
unsigned char* pixelsRGBA, int rgbaBufferSizeInPixels,
float* depthBuffer, int depthBufferSizeInPixels,
int* segmentationMaskBuffer, int segmentationMaskSizeInPixels,
@@ -1079,7 +1102,7 @@ void TinyRendererVisualShapeConverter::copyCameraImageDataGL(
}
}
-void TinyRendererVisualShapeConverter::copyCameraImageData(unsigned char* pixelsRGBA, int rgbaBufferSizeInPixels,
+void EGLRendererVisualShapeConverter::copyCameraImageData(unsigned char* pixelsRGBA, int rgbaBufferSizeInPixels,
float* depthBuffer, int depthBufferSizeInPixels,
int* segmentationMaskBuffer, int segmentationMaskSizeInPixels,
int startPixelIndex, int* widthPtr, int* heightPtr, int* numPixelsCopied)
@@ -1091,7 +1114,7 @@ void TinyRendererVisualShapeConverter::copyCameraImageData(unsigned char* pixels
startPixelIndex, widthPtr, heightPtr, numPixelsCopied);
}
-void TinyRendererVisualShapeConverter::removeVisualShape(int collisionObjectUniqueId)
+void EGLRendererVisualShapeConverter::removeVisualShape(int collisionObjectUniqueId)
{
TinyRendererObjectArray** ptrptr = m_data->m_swRenderInstances[collisionObjectUniqueId];
if (ptrptr && *ptrptr)
@@ -1110,7 +1133,7 @@ void TinyRendererVisualShapeConverter::removeVisualShape(int collisionObjectUniq
}
-void TinyRendererVisualShapeConverter::resetAll()
+void EGLRendererVisualShapeConverter::resetAll()
{
for (int i=0;i<m_data->m_swRenderInstances.size();i++)
{
@@ -1142,7 +1165,7 @@ void TinyRendererVisualShapeConverter::resetAll()
}
-void TinyRendererVisualShapeConverter::changeShapeTexture(int objectUniqueId, int jointIndex, int shapeIndex, int textureUniqueId)
+void EGLRendererVisualShapeConverter::changeShapeTexture(int objectUniqueId, int jointIndex, int shapeIndex, int textureUniqueId)
{
btAssert(textureUniqueId < m_data->m_textures.size());
if (textureUniqueId >= 0 && textureUniqueId < m_data->m_textures.size())
@@ -1170,7 +1193,7 @@ void TinyRendererVisualShapeConverter::changeShapeTexture(int objectUniqueId, in
}
}
-int TinyRendererVisualShapeConverter::registerTexture(unsigned char* texels, int width, int height)
+int EGLRendererVisualShapeConverter::registerTexture(unsigned char* texels, int width, int height)
{
MyTexture2 texData;
texData.m_width = width;
@@ -1181,7 +1204,7 @@ int TinyRendererVisualShapeConverter::registerTexture(unsigned char* texels, int
return m_data->m_textures.size()-1;
}
-int TinyRendererVisualShapeConverter::loadTextureFile(const char* filename)
+int EGLRendererVisualShapeConverter::loadTextureFile(const char* filename)
{
B3_PROFILE("loadTextureFile");
int width,height,n;
@@ -1194,7 +1217,7 @@ int TinyRendererVisualShapeConverter::loadTextureFile(const char* filename)
return -1;
}
-void TinyRendererVisualShapeConverter::syncTransform(int collisionObjectUniqueId, const btTransform& worldTransform, const btVector3& localScaling)
+void EGLRendererVisualShapeConverter::syncTransform(int collisionObjectUniqueId, const btTransform& worldTransform, const btVector3& localScaling)
{
TinyRendererObjectArray** renderObjPtr = m_data->m_swRenderInstances[collisionObjectUniqueId];
if (renderObjPtr)
@@ -1202,5 +1225,11 @@ void TinyRendererVisualShapeConverter::syncTransform(int collisionObjectUniqueId
TinyRendererObjectArray* renderObj = *renderObjPtr;
renderObj->m_worldTransform = worldTransform;
renderObj->m_localScaling = localScaling;
+ if (renderObj->m_graphicsInstanceId>=0)
+ {
+ btVector3 pos = worldTransform.getOrigin();
+ btQuaternion orn = worldTransform.getRotation();
+ m_data->m_instancingRenderer->writeSingleInstanceTransformToCPU(pos, orn, renderObj->m_graphicsInstanceId);
+ }
}
}
diff --git a/examples/SharedMemory/plugins/eglPlugin/eglRendererVisualShapeConverter.h b/examples/SharedMemory/plugins/eglPlugin/eglRendererVisualShapeConverter.h
index 6abe8c270..800c63b6a 100644
--- a/examples/SharedMemory/plugins/eglPlugin/eglRendererVisualShapeConverter.h
+++ b/examples/SharedMemory/plugins/eglPlugin/eglRendererVisualShapeConverter.h
@@ -3,15 +3,14 @@
#include "../../../Importers/ImportURDFDemo/UrdfRenderingInterface.h"
-struct TinyRendererVisualShapeConverter : public UrdfRenderingInterface
+struct EGLRendererVisualShapeConverter : public UrdfRenderingInterface
{
- int frame = 0;
-
- struct TinyRendererVisualShapeConverterInternalData* m_data;
+
+ struct EGLRendererVisualShapeConverterInternalData* m_data;
- TinyRendererVisualShapeConverter();
+ EGLRendererVisualShapeConverter();
- virtual ~TinyRendererVisualShapeConverter();
+ virtual ~EGLRendererVisualShapeConverter();
virtual void convertVisualShapes(int linkIndex, const char* pathPrefix, const btTransform& localInertiaFrame, const UrdfLink* linkPtr, const UrdfModel* model, int shapeUid, int objectIndex);
diff --git a/examples/SharedMemory/plugins/eglPlugin/premake4.lua b/examples/SharedMemory/plugins/eglPlugin/premake4.lua
index fd2b91db8..972b0566a 100644
--- a/examples/SharedMemory/plugins/eglPlugin/premake4.lua
+++ b/examples/SharedMemory/plugins/eglPlugin/premake4.lua
@@ -3,25 +3,36 @@
project ("pybullet_eglRendererPlugin")
language "C++"
kind "SharedLib"
+ initEGL()
includedirs {".","../../../../src", "../../../../examples",
- "../../../ThirdPartyLibs"}
- defines {"PHYSICS_IN_PROCESS_EXAMPLE_BROWSER"}
+ "../../../ThirdPartyLibs", ""../../examples/ThirdPartyLibs/glad"}
+ defines {"PHYSICS_IN_PROCESS_EXAMPLE_BROWSER", "STB_AGAIN"}
hasCL = findOpenCL("clew")
links{"BulletCollision", "Bullet3Common", "LinearMath"}
+ initOpenGL()
+
+ if os.is("Windows") then
+ files {"../../../OpenGLWindow/Win32OpenGLWindow.cpp",
+ "../../../OpenGLWindow/Win32GLWindow.cpp",}
+
+ end
if os.is("MacOSX") then
-- targetextension {"so"}
- links{"Cocoa.framework","Python"}
+ links{"Cocoa.framework"}
end
+ if os.is("Linux") then
+ files {"../../../ThirdPartyLibs/glad/glx.c",}
+ end
files {
"eglRendererPlugin.cpp",
"eglRendererPlugin.h",
- "TinyRendererVisualShapeConverter.cpp",
- "TinyRendererVisualShapeConverter.h",
+ "eglRendererVisualShapeConverter.cpp",
+ "eglRendererVisualShapeConverter.h",
"../../../Importers/ImportColladaDemo/LoadMeshFromCollada.cpp",
"../../../Importers/ImportColladaDemo/LoadMeshFromCollada.h",
"../../../Importers/ImportMeshUtility/b3ImportMeshUtility.cpp",
@@ -35,14 +46,22 @@ project ("pybullet_eglRendererPlugin")
"../../../TinyRenderer/our_gl.cpp",
"../../../TinyRenderer/tgaimage.cpp",
"../../../TinyRenderer/TinyRenderer.cpp",
- "../../../ThirdPartyLibs/Wavefront/egl_obj_loader.cpp",
- "../../../ThirdPartyLibs/Wavefront/egl_obj_loader.h",
+ "../../../ThirdPartyLibs/glad/gl.c",
+ "../../../ThirdPartyLibs/glad/egl.c",
+ "../../../ThirdPartyLibs/Wavefront/tiny_obj_loader.cpp",
+ "../../../ThirdPartyLibs/Wavefront/tiny_obj_loader.h",
"../../../ThirdPartyLibs/stb_image/stb_image.cpp",
"../../../ThirdPartyLibs/stb_image/stb_image.h",
- "../../../ThirdPartyLibs/eglxml2/eglxml2.cpp",
- "../../../ThirdPartyLibs/eglxml2/eglxml2.h",
+ "../../../ThirdPartyLibs/tinyxml2/tinyxml2.cpp",
+ "../../../ThirdPartyLibs/tinyxml2/tinyxml2.h",
"../../../OpenGLWindow/SimpleCamera.cpp",
"../../../OpenGLWindow/SimpleCamera.h",
+ "../../../OpenGLWindow/GLInstancingRenderer.cpp",
+ "../../../OpenGLWindow/GLInstancingRenderer.h",
+ "../../../OpenGLWindow/LoadShader.cpp",
+ "../../../OpenGLWindow/LoadShader.h",
+ "../../../OpenGLWindow/GLRenderToTexture.cpp",
+ "../../../OpenGLWindow/GLRenderToTexture.h",
"../../../Utils/b3Clock.cpp",
"../../../Utils/b3Clock.h",
"../../../Utils/b3ResourcePath.cpp",
diff --git a/examples/SharedMemory/premake4.lua b/examples/SharedMemory/premake4.lua
index 6ff1c32eb..417ff1447 100644
--- a/examples/SharedMemory/premake4.lua
+++ b/examples/SharedMemory/premake4.lua
@@ -474,6 +474,10 @@ include "plugins/tinyRendererPlugin"
include "plugins/pdControlPlugin"
include "plugins/collisionFilterPlugin"
+if _OPTIONS["enable_egl"] then
+ include "plugins/eglPlugin"
+end
+
if _OPTIONS["enable_grpc"] then
include "grpc"
include "plugins/grpcPlugin"