thebluefish
I noticed an odd lack of generic Billboard support. BillboardSet is good for some things, but isn’t good for others. Instead, I have created a simple Billboard component, that will Billboard any Node.
For example, let’s say I want to use RocketDocument3D to position/scale, but still keep the crispness.
This code is considered public domain.
BillboardComponent.h:
#ifndef _BILLBOARD_COMPONENT_H
#define _BILLBOARD_COMPONENT_H
#pragma once
#include "Component.h"
#include "Camera.h"
class Billboard : public Urho3D::Component
{
OBJECT(Billboard);
public:
Billboard(Urho3D::Context* context, Urho3D::Camera* camera = 0);
~Billboard();
static void RegisterObject(Urho3D::Context* context);
void SetCamera(Urho3D::Camera* camera);
protected:
void HandleUpdate(Urho3D::StringHash eventType, Urho3D::VariantMap& eventData);
protected:
Urho3D::WeakPtr<Urho3D::Camera> _camera;
};
#endif
BillboardComponent.cpp:
#include "BillboardComponent.h"
#include "Context.h"
#include "CoreEvents.h"
#include "Node.h"
Billboard::Billboard(Urho3D::Context* context, Urho3D::Camera* camera) : Urho3D::Component(context)
{
_camera = camera;
SubscribeToEvent(Urho3D::E_UPDATE, HANDLER(Billboard, HandleUpdate));
}
Billboard::~Billboard()
{
}
void Billboard::RegisterObject(Urho3D::Context* context)
{
context->RegisterFactory<Billboard>();
}
void Billboard::SetCamera(Urho3D::Camera* camera)
{
_camera = camera;
}
void Billboard::HandleUpdate(Urho3D::StringHash eventType, Urho3D::VariantMap& eventData)
{
Urho3D::Node* node = GetNode();
if (_camera.NotNull() && node)
{
node->SetWorldRotation(_camera->GetFaceCameraRotation(node->GetPosition(), node->GetRotation(), Urho3D::FC_ROTATE_XYZ));
}
}