mirror of
https://github.com/XProger/OpenLara.git
synced 2025-08-09 14:47:02 +02:00
triggers debug info; text rendering;
This commit is contained in:
@@ -306,6 +306,8 @@ struct Controller {
|
||||
activateNext();
|
||||
return;
|
||||
case TR::Action::FLOW :
|
||||
applyFlow(level->cameras[next->value]);
|
||||
break;
|
||||
case TR::Action::FLIP_MAP :
|
||||
case TR::Action::FLIP_ON :
|
||||
case TR::Action::FLIP_OFF :
|
||||
@@ -315,6 +317,9 @@ struct Controller {
|
||||
case TR::Action::CLEAR :
|
||||
case TR::Action::CAMERA_FLYBY :
|
||||
case TR::Action::CUTSCENE :
|
||||
LOG("! action is not implemented\n");
|
||||
actionCommand = next;
|
||||
activateNext();
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -328,6 +333,7 @@ struct Controller {
|
||||
virtual bool activate(ActionCommand *cmd) { actionCommand = cmd; return true; }
|
||||
virtual void doCustomCommand (int curFrame, int prevFrame) {}
|
||||
virtual void checkRoom() {}
|
||||
virtual void applyFlow(TR::Camera &sink) {}
|
||||
|
||||
virtual void cmdOffset(const vec3 &offset) {
|
||||
pos = pos + offset.rotateY(-angle.y);
|
||||
|
138
src/debug.h
138
src/debug.h
@@ -4,6 +4,7 @@
|
||||
#include "core.h"
|
||||
#include "format.h"
|
||||
#include "controller.h"
|
||||
#include "mesh.h"
|
||||
|
||||
namespace Debug {
|
||||
|
||||
@@ -332,12 +333,20 @@ namespace Debug {
|
||||
}
|
||||
|
||||
void entities(const TR::Level &level) {
|
||||
char buf[255];
|
||||
|
||||
for (int i = 0; i < level.entitiesCount; i++) {
|
||||
TR::Entity &e = level.entities[i];
|
||||
|
||||
char buf[255];
|
||||
sprintf(buf, "%d", (int)e.type);
|
||||
Debug::Draw::text(vec3(e.x, e.y, e.z), vec4(0.8, 0.0, 0.0, 1), buf);
|
||||
Debug::Draw::text(vec3(e.x, e.y, e.z), vec4(0.8, 0, 0, 1), buf);
|
||||
}
|
||||
|
||||
for (int i = 0; i < level.camerasCount; i++) {
|
||||
TR::Camera &c = level.cameras[i];
|
||||
|
||||
sprintf(buf, "%d (%d)", i, c.room);
|
||||
Debug::Draw::text(vec3(c.x, c.y, c.z), vec4(0, 0.8, 0, 1), buf);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -477,21 +486,138 @@ namespace Debug {
|
||||
}
|
||||
}
|
||||
|
||||
#define case_name(a,b) case a::b : return #b
|
||||
|
||||
const char *getTriggerType(const TR::Level &level, const TR::Level::Trigger &trigger) {
|
||||
switch (trigger) {
|
||||
case_name(TR::Level::Trigger, ACTIVATE );
|
||||
case_name(TR::Level::Trigger, PAD );
|
||||
case_name(TR::Level::Trigger, SWITCH );
|
||||
case_name(TR::Level::Trigger, KEY );
|
||||
case_name(TR::Level::Trigger, PICKUP );
|
||||
case_name(TR::Level::Trigger, HEAVY );
|
||||
case_name(TR::Level::Trigger, ANTIPAD );
|
||||
case_name(TR::Level::Trigger, COMBAT );
|
||||
case_name(TR::Level::Trigger, DUMMY );
|
||||
case_name(TR::Level::Trigger, ANTI );
|
||||
}
|
||||
return "UNKNOWN";
|
||||
}
|
||||
|
||||
const char *getTriggerAction(const TR::Level &level, const TR::Action &action) {
|
||||
switch (action) {
|
||||
case_name(TR::Action, ACTIVATE );
|
||||
case_name(TR::Action, CAMERA_SWITCH );
|
||||
case_name(TR::Action, FLOW );
|
||||
case_name(TR::Action, FLIP_MAP );
|
||||
case_name(TR::Action, FLIP_ON );
|
||||
case_name(TR::Action, FLIP_OFF );
|
||||
case_name(TR::Action, CAMERA_TARGET );
|
||||
case_name(TR::Action, END );
|
||||
case_name(TR::Action, SOUNDTRACK );
|
||||
case_name(TR::Action, HARDCODE );
|
||||
case_name(TR::Action, SECRET );
|
||||
case_name(TR::Action, CLEAR );
|
||||
case_name(TR::Action, CAMERA_FLYBY );
|
||||
case_name(TR::Action, CUTSCENE );
|
||||
}
|
||||
return "UNKNOWN";
|
||||
}
|
||||
|
||||
const char *getEntityName(const TR::Level &level, const TR::Entity &entity) {
|
||||
switch (entity.type) {
|
||||
case_name(TR::Entity, LARA );
|
||||
case_name(TR::Entity, ENEMY_TWIN );
|
||||
case_name(TR::Entity, ENEMY_WOLF );
|
||||
case_name(TR::Entity, ENEMY_BEAR );
|
||||
case_name(TR::Entity, ENEMY_BAT );
|
||||
case_name(TR::Entity, ENEMY_CROCODILE_LAND );
|
||||
case_name(TR::Entity, ENEMY_CROCODILE_WATER);
|
||||
case_name(TR::Entity, ENEMY_LION_MALE );
|
||||
case_name(TR::Entity, ENEMY_LION_FEMALE );
|
||||
case_name(TR::Entity, ENEMY_PUMA );
|
||||
case_name(TR::Entity, ENEMY_GORILLA );
|
||||
case_name(TR::Entity, ENEMY_RAT_LAND );
|
||||
case_name(TR::Entity, ENEMY_RAT_WATER );
|
||||
case_name(TR::Entity, ENEMY_REX );
|
||||
case_name(TR::Entity, ENEMY_RAPTOR );
|
||||
case_name(TR::Entity, ENEMY_MUTANT );
|
||||
case_name(TR::Entity, ENEMY_CENTAUR );
|
||||
case_name(TR::Entity, ENEMY_MUMMY );
|
||||
case_name(TR::Entity, ENEMY_LARSON );
|
||||
case_name(TR::Entity, TRAP_FLOOR );
|
||||
case_name(TR::Entity, TRAP_BLADE );
|
||||
case_name(TR::Entity, TRAP_SPIKES );
|
||||
case_name(TR::Entity, TRAP_BOULDER );
|
||||
case_name(TR::Entity, TRAP_DART );
|
||||
case_name(TR::Entity, TRAP_DARTGUN );
|
||||
case_name(TR::Entity, SWITCH );
|
||||
case_name(TR::Entity, SWITCH_WATER );
|
||||
case_name(TR::Entity, DOOR_1 );
|
||||
case_name(TR::Entity, DOOR_2 );
|
||||
case_name(TR::Entity, DOOR_3 );
|
||||
case_name(TR::Entity, DOOR_4 );
|
||||
case_name(TR::Entity, DOOR_BIG_1 );
|
||||
case_name(TR::Entity, DOOR_BIG_2 );
|
||||
case_name(TR::Entity, DOOR_5 );
|
||||
case_name(TR::Entity, DOOR_6 );
|
||||
case_name(TR::Entity, TRAP_DOOR_1 );
|
||||
case_name(TR::Entity, TRAP_DOOR_2 );
|
||||
case_name(TR::Entity, BRIDGE_0 );
|
||||
case_name(TR::Entity, BRIDGE_1 );
|
||||
case_name(TR::Entity, BRIDGE_2 );
|
||||
case_name(TR::Entity, GEARS_1 );
|
||||
case_name(TR::Entity, GEARS_2 );
|
||||
case_name(TR::Entity, GEARS_3 );
|
||||
case_name(TR::Entity, PUZZLE_1 );
|
||||
case_name(TR::Entity, PUZZLE_2 );
|
||||
case_name(TR::Entity, PUZZLE_3 );
|
||||
case_name(TR::Entity, PUZZLE_4 );
|
||||
case_name(TR::Entity, HOLE_PUZZLE );
|
||||
case_name(TR::Entity, HOLE_PUZZLE_SET );
|
||||
case_name(TR::Entity, PICKUP );
|
||||
case_name(TR::Entity, KEY_1 );
|
||||
case_name(TR::Entity, KEY_2 );
|
||||
case_name(TR::Entity, KEY_3 );
|
||||
case_name(TR::Entity, KEY_4 );
|
||||
case_name(TR::Entity, HOLE_KEY );
|
||||
case_name(TR::Entity, VIEW_TARGET );
|
||||
case_name(TR::Entity, SOURCE_WATER );
|
||||
}
|
||||
return "UNKNOWN";
|
||||
}
|
||||
|
||||
void info(const TR::Level &level, const TR::Entity &entity, Animation &anim) {
|
||||
float y = 0.0f;
|
||||
|
||||
char buf[255];
|
||||
sprintf(buf, "DIP = %d, TRI = %d, SND = %d", Core::stats.dips, Core::stats.tris, Sound::channelsCount);
|
||||
Debug::Draw::text(vec2(16, 16), vec4(1.0f), buf);
|
||||
Debug::Draw::text(vec2(16, y += 16), vec4(1.0f), buf);
|
||||
vec3 angle = ((Controller*)entity.controller)->angle * RAD2DEG;
|
||||
sprintf(buf, "pos = (%d, %d, %d), angle = (%d, %d), room = %d", entity.x, entity.y, entity.z, (int)angle.x, (int)angle.y, entity.room);
|
||||
Debug::Draw::text(vec2(16, 32), vec4(1.0f), buf);
|
||||
Debug::Draw::text(vec2(16, y += 16), vec4(1.0f), buf);
|
||||
int rate = anim.anims[anim.index].frameRate;
|
||||
sprintf(buf, "state = %d, anim = %d, next = %d, rate = %d, frame = %.2f / %d (%f)", anim.state, anim.index, anim.next, rate, anim.time * 30.0f, anim.framesCount, anim.delta);
|
||||
Debug::Draw::text(vec2(16, 48), vec4(1.0f), buf);
|
||||
Debug::Draw::text(vec2(16, y += 16), vec4(1.0f), buf);
|
||||
|
||||
TR::Level::FloorInfo info;
|
||||
level.getFloorInfo(entity.room, entity.x, entity.y, entity.z, info);
|
||||
sprintf(buf, "floor = %d, roomBelow = %d, roomAbove = %d, height = %d", info.floorIndex, info.roomBelow, info.roomAbove, info.floor - info.ceiling);
|
||||
Debug::Draw::text(vec2(16, 64), vec4(1.0f), buf);
|
||||
Debug::Draw::text(vec2(16, y += 16), vec4(1.0f), buf);
|
||||
|
||||
if (info.trigCmdCount > 0) {
|
||||
y += 16;
|
||||
sprintf(buf, "trigger: %s%s mask: %d", getTriggerType(level, info.trigger), info.trigInfo.once ? " (once)" : "", info.trigInfo.mask);
|
||||
Debug::Draw::text(vec2(16, y += 16), vec4(0.5f, 0.8f, 0.5f, 1.0f), buf);
|
||||
|
||||
for (int i = 0; i < info.trigCmdCount; i++) {
|
||||
TR::FloorData::TriggerCommand &cmd = info.trigCmd[i];
|
||||
|
||||
const char *ent = (cmd.action == TR::Action::ACTIVATE || cmd.action == TR::Action::CAMERA_TARGET) ? getEntityName(level, level.entities[cmd.args]) : "";
|
||||
sprintf(buf, "%s -> %s (%d)", getTriggerAction(level, cmd.action), ent, cmd.args);
|
||||
Debug::Draw::text(vec2(16, y += 16), vec4(0.1f, 0.6f, 0.1f, 1.0f), buf);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
16
src/format.h
16
src/format.h
@@ -268,13 +268,14 @@ namespace TR {
|
||||
uint16 timer:8, once:1, mask:5, :2;
|
||||
} triggerInfo;
|
||||
union TriggerCommand {
|
||||
uint16 value;
|
||||
struct {
|
||||
uint16 args:10;
|
||||
Action action:5;
|
||||
uint16 end:1;
|
||||
};
|
||||
struct {
|
||||
uint16 delay:8, once:1;
|
||||
uint16 delay:8, once:1, timer:7;
|
||||
};
|
||||
} triggerCmd;
|
||||
|
||||
@@ -375,6 +376,10 @@ namespace TR {
|
||||
BRIDGE_1 = 69,
|
||||
BRIDGE_2 = 70,
|
||||
|
||||
GEARS_1 = 74,
|
||||
GEARS_2 = 75,
|
||||
GEARS_3 = 76,
|
||||
|
||||
LARA_CUT = 77,
|
||||
|
||||
CRYSTAL = 83, // sprite
|
||||
@@ -421,8 +426,10 @@ namespace TR {
|
||||
MUZZLE_FLASH = 166,
|
||||
|
||||
VIEW_TARGET = 169,
|
||||
|
||||
SOURCE_WATER = 170,
|
||||
|
||||
GLYPH = 190, // sprite
|
||||
|
||||
} type;
|
||||
int16 room;
|
||||
int32 x, y, z;
|
||||
@@ -587,7 +594,10 @@ namespace TR {
|
||||
|
||||
struct Camera {
|
||||
int32 x, y, z;
|
||||
int16 room;
|
||||
union {
|
||||
int16 room; // for camera
|
||||
int16 speed; // for sink (underwater current)
|
||||
};
|
||||
uint16 flags;
|
||||
};
|
||||
|
||||
|
@@ -14,7 +14,7 @@ namespace Game {
|
||||
Core::init();
|
||||
level = new Level("LEVEL2_DEMO.PHD", true, false);
|
||||
//level = new Level("GYM.PHD", false, true);
|
||||
//level = new Level("LEVEL8A.PHD", false, false);
|
||||
//level = new Level("LEVEL3A.PHD", false, false);
|
||||
|
||||
#ifndef __EMSCRIPTEN__
|
||||
//Sound::play(Sound::openWAD("05_Lara's_Themes.wav"), 1, 1, 0);
|
||||
|
27
src/gui.glsl
Normal file
27
src/gui.glsl
Normal file
@@ -0,0 +1,27 @@
|
||||
R"====(
|
||||
varying vec2 vTexCoord;
|
||||
|
||||
#ifdef VERTEX
|
||||
uniform mat4 uViewProj;
|
||||
uniform mat4 uModel;
|
||||
|
||||
attribute vec4 aCoord;
|
||||
attribute vec4 aTexCoord;
|
||||
|
||||
#define TEXCOORD_SCALE (1.0 / 32767.0)
|
||||
|
||||
void main() {
|
||||
vec4 coord = uModel * vec4(aCoord.xyz, 1.0);
|
||||
vTexCoord = aTexCoord.xy * TEXCOORD_SCALE;
|
||||
coord.xy += aTexCoord.zw;
|
||||
gl_Position = uViewProj * coord;
|
||||
}
|
||||
#else
|
||||
uniform sampler2D sDiffuse;
|
||||
uniform vec4 uColor;
|
||||
|
||||
void main() {
|
||||
gl_FragColor = texture2D(sDiffuse, vTexCoord) * uColor;
|
||||
}
|
||||
#endif
|
||||
)===="
|
32
src/lara.h
32
src/lara.h
@@ -18,7 +18,8 @@
|
||||
#define TILT_MAX (PI / 18.0f)
|
||||
#define TILT_SPEED TILT_MAX
|
||||
|
||||
#define GLIDE_SPEED 50.0f
|
||||
#define GLIDE_SPEED 35.0f
|
||||
#define SWIM_SPEED 45.0f
|
||||
|
||||
#define LARA_HANG_OFFSET 735.0f
|
||||
|
||||
@@ -266,17 +267,22 @@ struct Lara : Character {
|
||||
pos = vec3(31390, -2048, 33472);
|
||||
angle = vec3(0.0f, 0.0f, 0.0f);
|
||||
getEntity().room = 63;
|
||||
*/
|
||||
|
||||
// level 2 (trap door)
|
||||
pos = vec3(21987, -1024, 29144);
|
||||
angle = vec3(0.0f, PI * 3.0f * 0.5f, 0.0f);
|
||||
getEntity().room = 61;
|
||||
/*
|
||||
// level 3a
|
||||
|
||||
// level 3a (t-rex)
|
||||
pos = vec3(41015, 3584, 34494);
|
||||
angle = vec3(0.0f, -PI, 0.0f);
|
||||
getEntity().room = 51;
|
||||
|
||||
// level 3a (gears)
|
||||
pos = vec3(38643, -3072, 92370);
|
||||
angle = vec3(0.0f, PI * 0.5f, 0.0f);
|
||||
getEntity().room = 5;
|
||||
|
||||
// level 1
|
||||
pos = vec3(20215, 6656, 52942);
|
||||
angle = vec3(0.0f, PI, 0.0f);
|
||||
@@ -912,6 +918,7 @@ struct Lara : Character {
|
||||
}
|
||||
|
||||
bool useItem(TR::Entity::Type item, TR::Entity::Type slot) {
|
||||
return true;
|
||||
if (item == TR::Entity::NONE) {
|
||||
switch (slot) {
|
||||
case TR::Entity::HOLE_KEY : item = TR::Entity::KEY_1; break; // TODO: 1-4
|
||||
@@ -1418,7 +1425,9 @@ struct Lara : Character {
|
||||
updateWeapon();
|
||||
}
|
||||
|
||||
virtual void updateVelocity() {
|
||||
virtual void updateVelocity() {
|
||||
checkTrigger();
|
||||
|
||||
// get turning angle
|
||||
float w = (input & LEFT) ? -1.0f : ((input & RIGHT) ? 1.0f : 0.0f);
|
||||
|
||||
@@ -1523,7 +1532,7 @@ struct Lara : Character {
|
||||
if (animation.index == ANIM_TO_UNDERWATER)
|
||||
speed = 15.0f;
|
||||
if (state == STATE_SWIM)
|
||||
speed = 35.0f;
|
||||
speed = SWIM_SPEED;
|
||||
|
||||
if (speed != 0.0f)
|
||||
velocity = vec3(angle.x, angle.y) * speed;
|
||||
@@ -1540,8 +1549,6 @@ struct Lara : Character {
|
||||
|
||||
if (velocity.length() >= 0.001f)
|
||||
move();
|
||||
|
||||
checkTrigger();
|
||||
}
|
||||
|
||||
void move() {
|
||||
@@ -1703,6 +1710,15 @@ struct Lara : Character {
|
||||
checkRoom();
|
||||
}
|
||||
|
||||
virtual void applyFlow(TR::Camera &sink) {
|
||||
if (stand != STAND_UNDERWATER && stand != STAND_ONWATER) return;
|
||||
vec3 v(0.0f);
|
||||
v.x = (float)sign((sink.x / 1024 - (int)pos.x / 1024));
|
||||
v.z = (float)sign((sink.z / 1024 - (int)pos.z / 1024));
|
||||
velocity = v * (sink.speed * 8.0f);
|
||||
}
|
||||
|
||||
|
||||
void renderMuzzleFlash(MeshBuilder *mesh, const mat4 &matrix, const vec3 &offset, float time) {
|
||||
ASSERT(level->extra.muzzleFlash);
|
||||
if (time > MUZZLE_FLASH_TIME) return;
|
||||
|
38
src/level.h
38
src/level.h
@@ -17,8 +17,12 @@ const char SHADER[] =
|
||||
#include "shader.glsl"
|
||||
;
|
||||
|
||||
const char GUI[] =
|
||||
#include "gui.glsl"
|
||||
;
|
||||
|
||||
struct Level {
|
||||
enum { shStatic, shCaustics, shSprite, shMAX };
|
||||
enum { shStatic, shCaustics, shSprite, shGUI, shMAX };
|
||||
|
||||
TR::Level level;
|
||||
Shader *shaders[shMAX];
|
||||
@@ -43,10 +47,10 @@ struct Level {
|
||||
for (int i = 0; i < level.entitiesBaseCount; i++) {
|
||||
TR::Entity &entity = level.entities[i];
|
||||
switch (entity.type) {
|
||||
case TR::Entity::LARA :
|
||||
case TR::Entity::LARA :
|
||||
entity.controller = (lara = new Lara(&level, i, home));
|
||||
break;
|
||||
case TR::Entity::LARA_CUT :
|
||||
case TR::Entity::LARA_CUT :
|
||||
entity.controller = (lara = new Lara(&level, i, false));
|
||||
break;
|
||||
case TR::Entity::ENEMY_WOLF :
|
||||
@@ -94,6 +98,11 @@ struct Level {
|
||||
case TR::Entity::BRIDGE_2 :
|
||||
entity.controller = new Bridge(&level, i);
|
||||
break;
|
||||
case TR::Entity::GEARS_1 :
|
||||
case TR::Entity::GEARS_2 :
|
||||
case TR::Entity::GEARS_3 :
|
||||
entity.controller = new Boulder(&level, i);
|
||||
break;
|
||||
case TR::Entity::TRAP_FLOOR :
|
||||
entity.controller = new TrapFloor(&level, i);
|
||||
break;
|
||||
@@ -107,8 +116,8 @@ struct Level {
|
||||
case TR::Entity::TRAP_DARTGUN :
|
||||
entity.controller = new Dartgun(&level, i);
|
||||
break;
|
||||
case TR::Entity::BLOCK_1 :
|
||||
case TR::Entity::BLOCK_2 :
|
||||
case TR::Entity::BLOCK_1 :
|
||||
case TR::Entity::BLOCK_2 :
|
||||
entity.controller = new Block(&level, i);
|
||||
break;
|
||||
case TR::Entity::SWITCH :
|
||||
@@ -117,7 +126,7 @@ struct Level {
|
||||
case TR::Entity::HOLE_KEY :
|
||||
entity.controller = new Trigger(&level, i, false);
|
||||
break;
|
||||
default :
|
||||
default :
|
||||
if (entity.modelIndex > 0)
|
||||
entity.controller = new Controller(&level, i);
|
||||
else
|
||||
@@ -172,6 +181,7 @@ struct Level {
|
||||
}
|
||||
}
|
||||
|
||||
// white texture
|
||||
for (int y = 1020; y < 1024; y++)
|
||||
for (int x = 1020; x < 1024; x++) {
|
||||
int i = y * 1024 + x;
|
||||
@@ -191,6 +201,7 @@ struct Level {
|
||||
shaders[shCaustics] = new Shader(SHADER, ext);
|
||||
sprintf(ext, "#define MAX_LIGHTS %d\n%s#define SPRITE\n", MAX_LIGHTS, def);
|
||||
shaders[shSprite] = new Shader(SHADER, ext);
|
||||
shaders[shGUI] = new Shader(GUI, "");
|
||||
}
|
||||
|
||||
void initOverrides() {
|
||||
@@ -500,7 +511,20 @@ struct Level {
|
||||
// Debug::Level::portals(level);
|
||||
// Debug::Level::meshes(level);
|
||||
Debug::Level::entities(level);
|
||||
Debug::Level::info(level, lara->getEntity(), lara->animation);
|
||||
/*
|
||||
shaders[shGUI]->bind();
|
||||
Core::mViewProj = mat4(0, (float)Core::width, (float)Core::height, 0, 0, 1);
|
||||
Core::active.shader->setParam(uViewProj, Core::mViewProj);
|
||||
atlas->bind(0);
|
||||
|
||||
glDisable(GL_DEPTH_TEST);
|
||||
glDisable(GL_CULL_FACE);
|
||||
//
|
||||
glEnable(GL_CULL_FACE);
|
||||
glEnable(GL_DEPTH_TEST);
|
||||
*/
|
||||
|
||||
Debug::Level::info(level, lara->getEntity(), lara->animation);
|
||||
Debug::end();
|
||||
#endif
|
||||
}
|
||||
|
118
src/mesh.h
118
src/mesh.h
@@ -139,6 +139,7 @@ struct MeshBuilder {
|
||||
|
||||
MeshRange *spriteSequences;
|
||||
MeshRange shadowBlob;
|
||||
MeshRange bar;
|
||||
|
||||
// indexed mesh
|
||||
Mesh *mesh;
|
||||
@@ -249,6 +250,14 @@ struct MeshBuilder {
|
||||
iCount += shadowBlob.iCount;
|
||||
vCount += 8;
|
||||
|
||||
// bar (health, oxygen)
|
||||
bar.vStart = vCount;
|
||||
bar.iStart = iCount;
|
||||
bar.iCount = 2 * 3;
|
||||
aCount++;
|
||||
iCount += bar.iCount;
|
||||
vCount += 4;
|
||||
|
||||
// make meshes buffer (single vertex buffer object for all geometry & sprites on level)
|
||||
Index *indices = new Index[iCount];
|
||||
Vertex *vertices = new Vertex[vCount];
|
||||
@@ -505,6 +514,23 @@ struct MeshBuilder {
|
||||
iCount += shadowBlob.iCount;
|
||||
vCount += 8;
|
||||
|
||||
// white bar
|
||||
addQuad(indices, iCount, vCount, bar.vStart, vertices, &whiteTileQuad);
|
||||
vertices[vCount + 0].coord = { 0, 0, 0, 0 };
|
||||
vertices[vCount + 1].coord = { 1, 0, 0, 0 };
|
||||
vertices[vCount + 2].coord = { 1, 1, 0, 0 };
|
||||
vertices[vCount + 3].coord = { 0, 1, 0, 0 };
|
||||
|
||||
for (int i = 0; i < 4; i++) {
|
||||
Vertex &v = vertices[vCount + i];
|
||||
v.normal = { 0, 0, 0, 0 };
|
||||
v.color = { 255, 255, 255, 255 };
|
||||
v.texCoord = { 32688, 32688, 0, 0 };
|
||||
}
|
||||
iCount += bar.iCount;
|
||||
vCount += 8;
|
||||
|
||||
// compile buffer and ranges
|
||||
mesh = new Mesh(indices, iCount, vertices, vCount, aCount);
|
||||
delete[] indices;
|
||||
delete[] vertices;
|
||||
@@ -666,10 +692,10 @@ struct MeshBuilder {
|
||||
int16 u1 = u0 + (sprite.w >> 3);
|
||||
int16 v1 = v0 + (sprite.h >> 3);
|
||||
|
||||
quad[0].texCoord = { u0, v0, sprite.r, sprite.t };
|
||||
quad[1].texCoord = { u1, v0, sprite.l, sprite.t };
|
||||
quad[2].texCoord = { u1, v1, sprite.l, sprite.b };
|
||||
quad[3].texCoord = { u0, v1, sprite.r, sprite.b };
|
||||
quad[0].texCoord = { u0, v0, sprite.l, sprite.t };
|
||||
quad[1].texCoord = { u1, v0, sprite.r, sprite.t };
|
||||
quad[2].texCoord = { u1, v1, sprite.r, sprite.b };
|
||||
quad[3].texCoord = { u0, v1, sprite.l, sprite.b };
|
||||
|
||||
vCount += 4;
|
||||
}
|
||||
@@ -708,6 +734,90 @@ struct MeshBuilder {
|
||||
void renderShadowSpot() {
|
||||
mesh->render(shadowBlob);
|
||||
}
|
||||
|
||||
void renderLine(const vec2 &pos, const vec2 &size, uint32 color) {
|
||||
|
||||
}
|
||||
|
||||
void renderBar(const vec2 &size, float value) {
|
||||
float w = size.y / 9.0f;
|
||||
/*
|
||||
// health bar
|
||||
enum Colors {
|
||||
clBlack = 0xFF000000,
|
||||
clGrayL = 0xFF748474,
|
||||
clGrayD = 0xFF4C504C,
|
||||
clRed1 = 0xFF705C2C,
|
||||
clRed2 = 0xFFA47848,
|
||||
clRed3 = 0xFF705C2C,
|
||||
clRed4 = 0xFF584400,
|
||||
clRed5 = 0xFF503014,
|
||||
};
|
||||
|
||||
uint32 *d = (uint32*)&data[0];
|
||||
d[0] = clGrayD; d[1] = clGrayD; d[2] = clGrayD; d[3] = clGrayD; d[4] = clGrayL; d+= 1024;
|
||||
d[0] = clGrayD; d[1] = clBlack; d[2] = clBlack; d[3] = clBlack; d[4] = clGrayL; d+= 1024;
|
||||
d[0] = clGrayD; d[1] = clBlack; d[2] = clRed1; d[3] = clBlack; d[4] = clGrayL; d+= 1024;
|
||||
d[0] = clGrayD; d[1] = clBlack; d[2] = clRed2; d[3] = clBlack; d[4] = clGrayL; d+= 1024;
|
||||
d[0] = clGrayD; d[1] = clBlack; d[2] = clRed3; d[3] = clBlack; d[4] = clGrayL; d+= 1024;
|
||||
d[0] = clGrayD; d[1] = clBlack; d[2] = clRed4; d[3] = clBlack; d[4] = clGrayL; d+= 1024;
|
||||
d[0] = clGrayD; d[1] = clBlack; d[2] = clRed5; d[3] = clBlack; d[4] = clGrayL; d+= 1024;
|
||||
d[0] = clGrayD; d[1] = clBlack; d[2] = clBlack; d[3] = clBlack; d[4] = clGrayL; d+= 1024;
|
||||
d[0] = clGrayD; d[1] = clGrayL; d[2] = clGrayL; d[3] = clGrayL; d[4] = clGrayL; d+= 1024;
|
||||
*/
|
||||
}
|
||||
|
||||
void textOut(const vec2 &pos, const vec4 &color, char *text) {
|
||||
const static uint8 char_width[110] = {
|
||||
14, 11, 11, 11, 11, 11, 11, 13, 8, 11, 12, 11, 13, 13, 12, 11, 12, 12, 11, 12, 13, 13, 13, 12,
|
||||
12, 11, 9, 9, 9, 9, 9, 9, 9, 9, 5, 9, 9, 5, 12, 10, 9, 9, 9, 8, 9, 8, 9, 9, 11, 9, 9, 9, 12, 8,
|
||||
10, 10, 10, 10, 10, 9, 10, 10, 5, 5, 5, 11, 9, 10, 8, 6, 6, 7, 7, 3, 11, 8, 13, 16, 9, 4, 12, 12,
|
||||
7, 5, 7, 7, 7, 7, 7, 7, 7, 7, 16, 14, 14, 14, 16, 16, 16, 16, 16, 12, 14, 8, 8, 8, 8, 8, 8, 8 };
|
||||
|
||||
static const uint8 char_map[102] = {
|
||||
0, 64, 66, 78, 77, 74, 78, 79, 69, 70, 92, 72, 63, 71, 62, 68, 52, 53, 54, 55, 56, 57, 58, 59,
|
||||
60, 61, 73, 73, 66, 74, 75, 65, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17,
|
||||
18, 19, 20, 21, 22, 23, 24, 25, 80, 76, 81, 97, 98, 77, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36,
|
||||
37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 100, 101, 102, 67, 0, 0, 0, 0, 0, 0, 0 };
|
||||
|
||||
if (!text) return;
|
||||
|
||||
Core::active.shader->setParam(uColor, color);
|
||||
//text = "a: b";
|
||||
mat4 m;
|
||||
m.identity();
|
||||
m.translate(vec3(pos.x, pos.y, 0.0f));
|
||||
// text = "A";
|
||||
while (char c = *text++) {
|
||||
|
||||
int frame = c > 10 ? (c > 15 ? char_map[c - 32] : c + 91) : c + 81;
|
||||
|
||||
|
||||
//int frame = T_remapASCII[c - 32];
|
||||
/*
|
||||
if (c >= 'A' && c <= 'Z')
|
||||
frame = c - 'A';
|
||||
else if (c >= 'a' && c <= 'z')
|
||||
frame = 26 + c - 'a';
|
||||
else if (c >= '0' && c <= '9')
|
||||
frame = 52 + c - '0';
|
||||
else {
|
||||
if (c == ' ')
|
||||
m.translate(vec3(16, 0.0f, 0.0f));
|
||||
continue;
|
||||
}
|
||||
*/
|
||||
if (c == ' ' || c == '_') {
|
||||
m.translate(vec3(char_width[0], 0.0f, 0.0f));
|
||||
continue;
|
||||
}
|
||||
|
||||
TR::SpriteTexture &s = level->spriteTextures[level->spriteSequences[15].sStart + frame];
|
||||
Core::active.shader->setParam(uModel, m);
|
||||
renderSprite(15, frame);
|
||||
m.translate(vec3(char_width[frame], 0.0f, 0.0f));
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
#endif
|
@@ -176,6 +176,7 @@
|
||||
<ClInclude Include="..\..\utils.h" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<None Include="..\..\gui.glsl" />
|
||||
<None Include="..\..\shader.glsl" />
|
||||
</ItemGroup>
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
|
||||
|
@@ -46,7 +46,7 @@ varying vec4 vColor;
|
||||
vNormal = uModel * aNormal;
|
||||
#else
|
||||
vTexCoord = aTexCoord.xy * TEXCOORD_SCALE;
|
||||
coord.xyz -= uViewInv[0].xyz * aTexCoord.z + uViewInv[1].xyz * aTexCoord.w;
|
||||
coord.xyz += uViewInv[0].xyz * aTexCoord.z - uViewInv[1].xyz * aTexCoord.w;
|
||||
vNormal = vec4(uViewPos.xyz - coord.xyz, 0.0);
|
||||
#endif
|
||||
|
||||
|
Reference in New Issue
Block a user