Add pybullet.addUserDebugPoints

This commit is contained in:
Kentaro Wada
2021-10-14 14:14:33 +01:00
parent 48dc1c45da
commit 00dcce85f5
17 changed files with 365 additions and 50 deletions

View File

@@ -134,6 +134,7 @@ enum MultiThreadedGUIHelperCommunicationEnums
eGUIHelperResetCamera,
eGUIHelperChangeGraphicsInstanceFlags,
eGUIHelperSetRgbBackground,
eGUIUserDebugAddPoints,
};
#include <stdio.h>
@@ -491,6 +492,19 @@ struct UserDebugDrawLine
int m_replaceItemUid;
};
struct UserDebugDrawPoint
{
const double* m_debugPointPositions;
const double* m_debugPointColors;
int m_debugPointNum;
double m_pointSize;
double m_lifeTime;
int m_itemUniqueId;
int m_trackingVisualShapeIndex;
int m_replaceItemUid;
};
struct UserDebugParameter
{
char m_text[1024];
@@ -1425,6 +1439,55 @@ public:
return m_resultDebugLineUid;
}
btAlignedObjectArray<UserDebugDrawPoint> m_userDebugPoints;
UserDebugDrawPoint m_tmpPoint;
int m_resultDebugPointUid;
virtual int addUserDebugPoints(const double* debugPointPositions, const double* debugPointColors, double pointSize, double lifeTime, int trackingVisualShapeIndex, int replaceItemUid, int debugPointNum)
{
m_tmpPoint.m_lifeTime = lifeTime;
m_tmpPoint.m_pointSize = pointSize;
m_tmpPoint.m_itemUniqueId = replaceItemUid < 0 ? m_uidGenerator++ : replaceItemUid;
m_tmpPoint.m_debugPointPositions = debugPointPositions;
m_tmpPoint.m_debugPointColors = debugPointColors;
m_tmpPoint.m_debugPointNum = debugPointNum;
m_tmpPoint.m_trackingVisualShapeIndex = trackingVisualShapeIndex;
m_tmpPoint.m_replaceItemUid = replaceItemUid;
//don't block when replacing an item
if (replaceItemUid>=0 && replaceItemUid<m_userDebugPoints.size())
{
//find the right slot
int slot=-1;
for (int i=0;i<m_userDebugPoints.size();i++)
{
if (replaceItemUid == m_userDebugPoints[i].m_itemUniqueId)
{
slot = i;
}
}
if (slot>=0)
{
m_userDebugPoints[slot] = m_tmpPoint;
}
m_resultDebugPointUid = replaceItemUid;
}
else
{
m_cs->lock();
setSharedParam(1, eGUIUserDebugAddPoints);
m_resultDebugPointUid = -1;
workerThreadWait();
}
return m_resultDebugPointUid;
}
int m_removeDebugItemUid;
virtual void removeUserDebugItem(int debugItemUniqueId)
@@ -2601,6 +2664,29 @@ void PhysicsServerExample::updateGraphics()
m_multiThreadedHelper->mainThreadRelease();
break;
}
case eGUIUserDebugAddPoints:
{
B3_PROFILE("eGUIUserDebugAddPoints");
if (m_multiThreadedHelper->m_tmpPoint.m_replaceItemUid >= 0)
{
for (int i = 0; i < m_multiThreadedHelper->m_userDebugPoints.size(); i++)
{
if (m_multiThreadedHelper->m_userDebugPoints[i].m_itemUniqueId == m_multiThreadedHelper->m_tmpPoint.m_replaceItemUid)
{
m_multiThreadedHelper->m_userDebugPoints[i] = m_multiThreadedHelper->m_tmpPoint;
m_multiThreadedHelper->m_resultDebugPointUid = m_multiThreadedHelper->m_tmpPoint.m_replaceItemUid;
}
}
}
else
{
m_multiThreadedHelper->m_userDebugPoints.push_back(m_multiThreadedHelper->m_tmpPoint);
m_multiThreadedHelper->m_resultDebugPointUid = m_multiThreadedHelper->m_userDebugPoints[m_multiThreadedHelper->m_userDebugPoints.size() - 1].m_itemUniqueId;
}
m_multiThreadedHelper->mainThreadRelease();
break;
}
case eGUIUserDebugRemoveItem:
{
B3_PROFILE("eGUIUserDebugRemoveItem");
@@ -2615,6 +2701,16 @@ void PhysicsServerExample::updateGraphics()
}
}
for (int i = 0; i < m_multiThreadedHelper->m_userDebugPoints.size(); i++)
{
if (m_multiThreadedHelper->m_userDebugPoints[i].m_itemUniqueId == m_multiThreadedHelper->m_removeDebugItemUid)
{
m_multiThreadedHelper->m_userDebugPoints.swap(i, m_multiThreadedHelper->m_userDebugPoints.size() - 1);
m_multiThreadedHelper->m_userDebugPoints.pop_back();
break;
}
}
for (int i = 0; i < m_multiThreadedHelper->m_userDebugText.size(); i++)
{
if (m_multiThreadedHelper->m_userDebugText[i].m_itemUniqueId == m_multiThreadedHelper->m_removeDebugItemUid)
@@ -2932,6 +3028,28 @@ void PhysicsServerExample::drawUserDebugLines()
m_multiThreadedHelper->m_userDebugText[i].textSize);
*/
}
for (int i = 0; i < m_multiThreadedHelper->m_userDebugPoints.size(); i++) {
const double* positions = m_multiThreadedHelper->m_userDebugPoints[i].m_debugPointPositions;
const double* colors = m_multiThreadedHelper->m_userDebugPoints[i].m_debugPointColors;
const int pointNum = m_multiThreadedHelper->m_userDebugPoints[i].m_debugPointNum;
const double sz = m_multiThreadedHelper->m_userDebugPoints[i].m_pointSize;
float* pos = (float*)malloc(pointNum * 3 * sizeof(float));
float* clr = (float*)malloc(pointNum * 4 * sizeof(float));
for (int i = 0; i < pointNum; i++) {
pos[i * 3 + 0] = (float)positions[i * 3 + 0];
pos[i * 3 + 1] = (float)positions[i * 3 + 1];
pos[i * 3 + 2] = (float)positions[i * 3 + 2];
clr[i * 4 + 0] = (float)colors[i * 3 + 0];
clr[i * 4 + 1] = (float)colors[i * 3 + 1];
clr[i * 4 + 2] = (float)colors[i * 3 + 2];
clr[i * 4 + 3] = 1.f;
}
m_guiHelper->getAppInterface()->m_renderer->drawPoints(pos, clr, pointNum, 3 * sizeof(float), sz);
free(pos);
free(clr);
}
}
}