Flying along now the fiddly bits are sorted
. Implemented crouching, with the obligatory only stand up if there is room behaviour in the character controller. All seems to work very well so far.
Been messing about today as well with the systems I have to make debugging shapes for rendering. I had a bunch of functions that put vertices into a vertex buffer passed as a method, but problem was until these functions completed, you don't know how big the buffers need to be, which is fine when adding them to the single (large) debug vertex buffer for compositing a debug view of the scene, but not a lot of good when trying to create a persistent buffer containing, say, a capsule at startup.
I made a VertexStream abstract class and changed all methods that were taking a VertexBuffer to take this instead of the reference to a buffer, then implemented two child classes of VertexStream, one taking a vertex buffer and the other taking one of my DataOutMemoryStream classes, which is based on a std::stringstream.
So now I can still use these methods to push vertices directly into a locked, dynamic vertex buffer, but can also get them to fill a stringstream which can then be fed as the initial input to a VertexBuffer as a separate step.
Long and short of it means I can now create a debug mesh for the character to plug into my Scene system, which stores SceneItems who have a reference to a mesh. I added a setScale method to the SceneItem so I could show the capsule standing and ducking.
I have moved all the character controller stuff into a class called Kcc (kinematic character controller) which an Entity can now own if it wants CC behaviour. So the Pc (player character) class is looking like this now:
Pc::Pc(Camera &camera, Physics &physics, Scene &scene, RenderResourceId mesh) : camera(camera), kcc(0.25f, 1, 0.75f, Vec3(0, 0, 6), physics)
sceneItem = scene.add(new SceneItem(mesh));
void Pc::update(Physics &physics, float delta)
kcc.move(getVelocity(camera) * 4, physics, delta);
setDebugScreenMessage(kcc.grounded() ? "Grounded" : "Airborne");
void Pc::prepareScene(float blend)
sceneItem->setScale(Vec3(1, kcc.crouched() ? 0.75f : 1, 1));
The physics.setHighlight() stuff is just to show the current floor for debugging, hence the hot pink floor in the image.
Nice clean usage, and the Kcc is easily reusable for non-player characters if we ever get that far.
So I suppose the next step is to get a rigged, animated mesh in place instead of the capsule, and start to look at all the fun that is inverse kinematics and getting feet placed properly on uneven terrain. Done a fair bit of research into this but not actually implemented anything so should be yet another fun adventure that makes me want to kill myself.
Since victory is preferrable to death, been a good day.
[EDIT] Getting things in place for a broadphase sweep...