Files
Webcam/include/modules/physic_bullet/bullet_debug.cpp

84 lines
3.0 KiB
C++

/* -----------------------------------------------------------------------------
GSFramework
Copyright 2001-2013 Emmanuel Julien. All Rights Reserved.
----------------------------------------------------------------------------- */
#include "physic_bullet/bullet_debug.h"
#include "core/renderer.h"
#include "core/renderer_toolbox.h"
#include "core/camera.h"
#include "gpu/gpu_renderer.h"
using namespace GS::S3D;
//------------------------------------------------------------------------------
void BulletDebugDraw::Flush()
{
renderer.DrawLine(line_count, vtx_cache, col_cache, xray_first_pass ? GS::Core::Material::Blend_Alpha : GS::Core::Material::Blend_None, GS::Core::Material::Render_NoZWrite);
line_count = 0;
}
//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
float BulletDebugDraw::GetXRayAlpha() const
{ return xray_first_pass ? 0.2f : 1.f; }
void BulletDebugDraw::SetXRayFirstPass(bool pass)
{
// FIXME: WTF!?
((GS::GPU::Renderer &)renderer).SetDepthFunc(pass ? GS::GPU::Renderer::DepthGreater : GS::GPU::Renderer::DepthLessEqual);
xray_first_pass = pass;
}
//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
void BulletDebugDraw::drawLine(const btVector3 &from, const btVector3 &to, const btVector3 &color)
{
if (line_count == 2048)
Flush();
vtx_cache[(line_count << 1) + 0].Set(from.x(), from.y(), from.z());
vtx_cache[(line_count << 1) + 1].Set(to.x(), to.y(), to.z());
col_cache[(line_count << 1) + 0].Set(color.x(), color.y(), color.z(), GetXRayAlpha());
col_cache[(line_count << 1) + 1].Set(color.x(), color.y(), color.z(), GetXRayAlpha());
++line_count;
}
void BulletDebugDraw::drawContactPoint(const btVector3 &PointOnB, const btVector3 &/*normalOnB*/, btScalar /*distance*/, int /*lifeTime*/, const btVector3 &color)
{
drawLine(PointOnB - btVector3(0.25, 0, 0), PointOnB + btVector3(0.25, 0, 0), color);
drawLine(PointOnB - btVector3(0, 0.25, 0), PointOnB + btVector3(0, 0.25, 0), color);
drawLine(PointOnB - btVector3(0, 0, 0.25), PointOnB + btVector3(0, 0, 0.25), color);
}
void BulletDebugDraw::reportErrorWarning(const char *)
{}
void BulletDebugDraw::draw3dText(const btVector3 &p, const char *text)
{
if (camera && raster_font)
{
Matrix4 m = camera->GetMatrix();
m.SetRow(3, Vector4(p.x(), p.y(), p.z()));
renderer.SetWorldMatrix(m);
float x = 0, y = 0;
Renderer::WriterConfig config(true, false);
renderer.Write(*raster_font, text, x, y, config, 2.f);
renderer.SetWorldMatrix(Matrix4::IdentityMatrix(), &Matrix4::IdentityMatrix());
}
}
//------------------------------------------------------------------------------
BulletDebugDraw::BulletDebugDraw(Renderer &r) : renderer(r)
{
vtx_cache.Allocate(2048 * 2);
col_cache.Allocate(2048 * 2);
line_count = 0;
camera = NULL;
raster_font = NULL;
xray_first_pass = true;
}