From e827cf201f4fac01d15c17f0c9dfc2df74685f49 Mon Sep 17 00:00:00 2001 From: XProger Date: Mon, 17 Oct 2016 22:16:13 +0300 Subject: [PATCH] #12 simple spot shadows for enemies --- bin/OpenLara.exe | Bin 88576 -> 89600 bytes src/format.h | 4 ++++ src/level.h | 21 ++++++++++++++++++++- src/mesh.h | 35 +++++++++++++++++++++++++++++++++-- 4 files changed, 57 insertions(+), 3 deletions(-) diff --git a/bin/OpenLara.exe b/bin/OpenLara.exe index 52cb0b39bb1facc56b4f08d574d4ef9fdfcf3507..6b08a4ed61feba9d8e0f5f80e456753e83f66a58 100644 GIT binary patch delta 20157 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 JE8^Sv{{wT_otyvw diff --git a/src/format.h b/src/format.h index 38d0f20..023f3cb 100644 --- a/src/format.h +++ b/src/format.h @@ -1043,6 +1043,10 @@ namespace TR { } }; // struct Level + + bool castShadow(Entity::Type type) { + return (type >= Entity::ENEMY_TWIN && type <= Entity::ENEMY_LARSON) || type == Entity::LARA || type == Entity::LARA_CUT; + } } #endif \ No newline at end of file diff --git a/src/level.h b/src/level.h index 59a2a44..3001fc3 100644 --- a/src/level.h +++ b/src/level.h @@ -356,6 +356,19 @@ struct Level { return ma.getRot().slerp(mb.getRot(), t).normal(); } + void renderShadow(const vec3 &pos, const vec3 &offset, const vec3 &size, float angle) { + mat4 m; + m.identity(); + m.translate(pos); + m.rotateY(angle); + m.translate(vec3(offset.x, 0.0f, offset.z)); + m.scale(vec3(size.x, 0.0f, size.z) / 1024.0f); + + Core::active.shader->setParam(uModel, m); + Core::active.shader->setParam(uColor, vec4(0.0f, 0.0f, 0.0f, 0.5f)); + mesh->renderShadowSpot(); + } + void renderModel(const TR::Model &model, const TR::Entity &entity) { TR::Animation *anim; float fTime; @@ -441,6 +454,12 @@ struct Level { renderMesh(model.mStart + i); Core::mModel = tmp; } + + if (TR::castShadow(entity.type)) { + TR::Level::FloorInfo info; + level.getFloorInfo(entity.room, entity.x, entity.z, info, true); + renderShadow(vec3(entity.x, info.floor - 16.0f, entity.z), (bmax + bmin) * 0.5f, (bmax - bmin) * 0.8f, entity.rotation); + } } void renderSequence(const TR::Entity &entity) { @@ -618,7 +637,7 @@ struct Level { // Debug::Level::rooms(level, lara->pos, lara->getEntity().room); // Debug::Level::lights(level); // Debug::Level::portals(level); - Debug::Level::meshes(level); + // Debug::Level::meshes(level); // Debug::Level::entities(level); Debug::Level::info(level, lara->getEntity(), (int)lara->state, lara->animIndex, int(lara->animTime * 30.0f)); Debug::end(); diff --git a/src/mesh.h b/src/mesh.h index ae2fef7..20e2359 100644 --- a/src/mesh.h +++ b/src/mesh.h @@ -73,8 +73,8 @@ struct MeshBuilder { } *meshInfo; int mCount; -// sprite sequences - MeshRange *sequenceRanges; + MeshRange *sequenceRanges; // sprite sequences + MeshRange shadowSpot; // indexed mesh Mesh *mesh; @@ -170,6 +170,13 @@ struct MeshBuilder { vCount += level.spriteSequences[i].sCount * 4; } + // get size of simple shadow spot mesh (8 triangles, 8 vertices) + shadowSpot.vStart = vCount; + shadowSpot.iStart = iCount; + shadowSpot.iCount = 8 * 3; + iCount += shadowSpot.iCount; + vCount += 8; + // make meshes buffer (single vertex buffer object for all geometry & sprites on level) Index *indices = new Index[iCount]; Vertex *vertices = new Vertex[vCount]; @@ -369,6 +376,26 @@ struct MeshBuilder { addSprite(indices, vertices, iCount, vCount, vCount, 0, 0, 0, sprite, 255); } + // build shadow spot + for (int i = 0; i < 8; i++) { + Vertex &v = vertices[vCount + i]; + v.normal = { 0, 0, 0, 1 }; + v.color = { 255, 255, 255, 255 }; + v.texCoord = { 32688, 32688, 0, 0 }; + + float a = i * (PI / 4.0f) + (PI / 8.0f); + short c = short(cosf(a) * 512.0f); + short s = short(sinf(a) * 512.0f); + v.coord = { c, 0, s, 0 }; + + int idx = iCount + i * 3; + indices[idx + 0] = i; + indices[idx + 1] = 0; + indices[idx + 2] = (i + 1) % 8; + } + iCount += shadowSpot.iCount; + vCount += 8; + mesh = new Mesh(indices, iCount, vertices, vCount); delete[] indices; delete[] vertices; @@ -551,6 +578,10 @@ struct MeshBuilder { range.vStart += frame * 4; mesh->render(range); } + + void renderShadowSpot() { + mesh->render(shadowSpot); + } }; #endif \ No newline at end of file