84 lines
3.0 KiB
C++
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;
|
|
}
|