avatar.pos.y -= speed;
}
- float theta = M_PI * avatar.body_rot / 180.0f;
- Vec3 newpos;
- newpos.x = avatar.pos.x + cos(theta) * dir.x - sin(theta) * dir.z;
- newpos.y = avatar.pos.y;
- newpos.z = avatar.pos.z + sin(theta) * dir.x + cos(theta) * dir.z;
+ Vec3 walk_dir = avatar.calc_walk_dir(dir.z, dir.x);
+ Vec3 newpos = avatar.pos + walk_dir;
if(noclip) {
avatar.pos = newpos;
exui_change_tab(1);
break;
+ case '\t':
+ if(exsel_grab_mouse) {
+ Exhibit *ex = exsel_grab_mouse.ex;
+ exslot_mouse.detach_exhibit();
+ exman->stash_exhibit(ex);
+ exsel_grab_mouse = ExSelection::null;
+ } else {
+ Exhibit *ex = exman->unstash_exhibit();
+ if(ex) {
+ exslot_mouse.attach_exhibit(ex, EXSLOT_ATTACH_TRANSIENT);
+ exsel_grab_mouse = ex;
+
+ Vec3 fwd = avatar.get_body_fwd();
+ exslot_mouse.node.set_position(avatar.pos + fwd * 100);
+ }
+ }
+ break;
+
case KEY_F5:
case KEY_F6:
case KEY_F7:
exslot_mouse.detach_exhibit();
- ExhibitSlot *slot = exman->nearest_empty_slot(pos, 100);
+ ExhibitSlot *slot = exman->nearest_empty_slot(pos, 300);
if(!slot) {
debug_log("no empty slot nearby\n");
if(ex->prev_slot && ex->prev_slot->empty()) {
static inline void mouse_look(float dx, float dy)
{
float scrsz = (float)win_height;
- avatar.body_rot += dx * 512.0 / scrsz;
+ avatar.set_body_rotation(avatar.body_rot + dx * 512.0 / scrsz);
avatar.head_alt += dy * 512.0 / scrsz;
if(avatar.head_alt < -90) avatar.head_alt = -90;
#include "avatar.h"
+#include "logger.h"
Avatar::Avatar()
{
void Avatar::set_body_rotation(float rot)
{
body_rot = rot;
+
+ float theta = deg_to_rad(body_rot);
+ fwd.x = sin(theta);
+ fwd.y = 0;
+ fwd.z = -cos(theta);
+ right = Vec3(-fwd.z, 0, fwd.x);
}
float Avatar::get_body_rotation() const
Vec3 Avatar::calc_walk_dir(float fwd, float right) const
{
- // TODO
- return Vec3(0, 0, 0);
+ float theta = M_PI * body_rot / 180.0f;
+ float dx = cos(theta) * right - sin(theta) * fwd;
+ float dz = sin(theta) * right + cos(theta) * fwd;
+ return Vec3(dx, 0, dz);
}
void Avatar::walk(float fwd, float right)
class ExhibitManager {
private:
std::vector<Exhibit*> items, stashed;
+ int cur_stashed;
std::vector<ExhibitSlot*> exslots;
// TODO kdtree of slots for quick nearest queries
ExhibitSlot *nearest_empty_slot(const Vec3 &pos, float max_dist = 10) const;
void stash_exhibit(Exhibit *ex);
+ Exhibit *unstash_exhibit();
void update(float dt = 0.0f);
void draw() const;