Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions src.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -95,6 +95,8 @@ set(RENDERERLIST
${ENGINE_DIR}/renderer/tr_curve.cpp
${ENGINE_DIR}/renderer/tr_fbo.cpp
${ENGINE_DIR}/renderer/tr_font.cpp
${ENGINE_DIR}/renderer/EntityCache.cpp
${ENGINE_DIR}/renderer/EntityCache.h
${ENGINE_DIR}/renderer/GeometryCache.cpp
${ENGINE_DIR}/renderer/GeometryCache.h
${ENGINE_DIR}/renderer/GeometryOptimiser.cpp
Expand Down
82 changes: 73 additions & 9 deletions src/engine/client/cg_msgdef.h
Original file line number Diff line number Diff line change
Expand Up @@ -91,22 +91,84 @@ namespace Util {
}
};

template<> struct SerializeTraits<std::vector<BoneMod>> {
static void Write( Writer& stream, const std::vector<BoneMod>& boneMods ) {
stream.WriteSize( boneMods.size() );
stream.WriteData( boneMods.data(), boneMods.size() * sizeof( BoneMod ) );
}

static std::vector<BoneMod> Read( Reader& stream ) {
std::vector<BoneMod> boneMods;
const size_t size = stream.ReadSize<BoneMod>();
boneMods.resize( size );
stream.ReadData( boneMods.data(), size * sizeof( BoneMod ) );
return boneMods;
}
};

// Use that bone optimization for refEntity_t
template<> struct SerializeTraits<refEntity_t> {
static void Write(Writer& stream, const refEntity_t& ent)
{
stream.WriteData(&ent, offsetof(refEntity_t, skeleton));
stream.Write<refSkeleton_t>(ent.skeleton);
stream.WriteData(&ent, offsetof(refEntity_t, tag));
stream.Write<std::string>( ent.tag );
stream.Write<std::vector<BoneMod>>( ent.boneMods );
// stream.Write<refSkeleton_t>(ent.skeleton);
}

static refEntity_t Read(Reader& stream)
{
refEntity_t ent;
stream.ReadData(&ent, offsetof(refEntity_t, skeleton));
ent.skeleton = stream.Read<refSkeleton_t>();
stream.ReadData(&ent, offsetof(refEntity_t, tag));
ent.tag = stream.Read<std::string>();
ent.boneMods = stream.Read<std::vector<BoneMod>>();
// ent.skeleton = stream.Read<refSkeleton_t>();
return ent;
}
};

template<> struct SerializeTraits<EntityUpdate> {
static void Write( Writer& stream, const EntityUpdate& ent ) {
stream.Write<refEntity_t>( ent.ent );
stream.Write<uint16_t>( ent.id );
}

static EntityUpdate Read( Reader& stream ) {
EntityUpdate ent;
ent.ent = stream.Read<refEntity_t>();
ent.id = stream.Read<uint16_t>();
return ent;
}
};

template<> struct SerializeTraits<LerpTagUpdate> {
static void Write( Writer& stream, const LerpTagUpdate& tag ) {
stream.Write<std::string>( tag.tag );
stream.Write<uint16_t>( tag.id );
}

static LerpTagUpdate Read( Reader& stream ) {
LerpTagUpdate tag;
tag.tag = stream.Read<std::string>();
tag.id = stream.Read<uint16_t>();
return tag;
}
};

template<> struct SerializeTraits<LerpTagSync> {
static void Write( Writer& stream, const LerpTagSync& tag ) {
stream.Write<orientation_t>( tag.entityOrientation );
stream.Write<orientation_t>( tag.orientation );
}

static LerpTagSync Read( Reader& stream ) {
LerpTagSync tag;
tag.entityOrientation = stream.Read<orientation_t>();
tag.orientation = stream.Read<orientation_t>();
return tag;
}
};

template<>
struct SerializeTraits<Color::Color> {
static void Write(Writer& stream, const Color::Color& value)
Expand Down Expand Up @@ -166,6 +228,8 @@ enum cgameImport_t
CG_R_REGISTERFONT,
CG_R_CLEARSCENE,
CG_R_ADDREFENTITYTOSCENE,
CG_R_SYNCREFENTITIES,
CG_R_SYNCLERPTAGS,
CG_R_ADDPOLYTOSCENE,
CG_R_ADDPOLYSTOSCENE,
CG_R_ADDLIGHTTOSCENE,
Expand All @@ -179,7 +243,6 @@ enum cgameImport_t
CG_R_DRAWSTRETCHPIC,
CG_R_DRAWROTATEDPIC,
CG_R_MODELBOUNDS,
CG_R_LERPTAG,
CG_R_REMAP_SHADER,
CG_R_BATCHINPVS,
CG_R_LIGHTFORPOINT,
Expand Down Expand Up @@ -319,10 +382,6 @@ namespace Render {
IPC::Message<IPC::Id<VM::QVM, CG_R_MODELBOUNDS>, int>,
IPC::Reply<std::array<float, 3>, std::array<float, 3>>
>;
using LerpTagMsg = IPC::SyncMessage<
IPC::Message<IPC::Id<VM::QVM, CG_R_LERPTAG>, refEntity_t, std::string, int>,
IPC::Reply<orientation_t, int>
>;
using RemapShaderMsg = IPC::Message<IPC::Id<VM::QVM, CG_R_REMAP_SHADER>, std::string, std::string, std::string>;
// TODO not a renderer call, handle in CM in the VM?
using BatchInPVSMsg = IPC::SyncMessage<
Expand Down Expand Up @@ -379,6 +438,11 @@ namespace Render {
using ScissorSetMsg = IPC::Message<IPC::Id<VM::QVM, CG_R_SCISSOR_SET>, int, int, int, int>;
using ClearSceneMsg = IPC::Message<IPC::Id<VM::QVM, CG_R_CLEARSCENE>>;
using AddRefEntityToSceneMsg = IPC::Message<IPC::Id<VM::QVM, CG_R_ADDREFENTITYTOSCENE>, refEntity_t>;
using SyncRefEntitiesMsg = IPC::Message<IPC::Id<VM::QVM, CG_R_SYNCREFENTITIES>, std::vector<EntityUpdate>>;
using SyncLerpTagsMsg = IPC::SyncMessage<IPC::Message<IPC::Id<VM::QVM, CG_R_SYNCLERPTAGS>,
std::vector<LerpTagUpdate>>,
IPC::Reply<std::vector<LerpTagSync>>
>;
using AddPolyToSceneMsg = IPC::Message<IPC::Id<VM::QVM, CG_R_ADDPOLYTOSCENE>, int, std::vector<polyVert_t>>;
using AddPolysToSceneMsg = IPC::Message<IPC::Id<VM::QVM, CG_R_ADDPOLYSTOSCENE>, int, std::vector<polyVert_t>, int, int>;
using AddLightToSceneMsg = IPC::Message<IPC::Id<VM::QVM, CG_R_ADDLIGHTTOSCENE>, std::array<float, 3>, float, float, float, float, int>;
Expand Down
19 changes: 13 additions & 6 deletions src/engine/client/cl_cgame.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1112,6 +1112,13 @@ void CGameVM::QVMSyscall(int syscallNum, Util::Reader& reader, IPC::Channel& cha
});
break;

case CG_R_SYNCLERPTAGS:
IPC::HandleMsg<Render::SyncLerpTagsMsg>( channel, std::move( reader ), [this]( const std::vector<LerpTagUpdate>& lerpTags,
std::vector<LerpTagSync>& entityOrientations ) {
entityOrientations = re.SyncLerpTags( lerpTags );
} );
break;

case CG_GETCURRENTSNAPSHOTNUMBER:
IPC::HandleMsg<GetCurrentSnapshotNumberMsg>(channel, std::move(reader), [this] (int& number, int& serverTime) {
number = cl.snap.messageNum;
Expand Down Expand Up @@ -1216,12 +1223,6 @@ void CGameVM::QVMSyscall(int syscallNum, Util::Reader& reader, IPC::Channel& cha
});
break;

case CG_R_LERPTAG:
IPC::HandleMsg<Render::LerpTagMsg>(channel, std::move(reader), [this] (const refEntity_t& entity, const std::string& tagName, int startIndex, orientation_t& tag, int& res) {
res = re.LerpTag(&tag, &entity, tagName.c_str(), startIndex);
});
break;

case CG_R_REMAP_SHADER:
IPC::HandleMsg<Render::RemapShaderMsg>(channel, std::move(reader), [this] (const std::string& oldShader, const std::string& newShader, const std::string& timeOffset) {
re.RemapShader(oldShader.c_str(), newShader.c_str(), timeOffset.c_str());
Expand Down Expand Up @@ -1598,6 +1599,12 @@ void CGameVM::CmdBuffer::HandleCommandBufferSyscall(int major, int minor, Util::
});
break;

case CG_R_SYNCREFENTITIES:
HandleMsg<Render::SyncRefEntitiesMsg>( std::move( reader ), [this]( const std::vector<EntityUpdate>& ents ) {
re.SyncRefEntities( ents );
} );
break;

case CG_R_ADDPOLYTOSCENE:
HandleMsg<Render::AddPolyToSceneMsg>(std::move(reader), [this] (int shader, const std::vector<polyVert_t>& verts) {
re.AddPolyToScene(shader, verts.size(), verts.data());
Expand Down
8 changes: 7 additions & 1 deletion src/engine/null/null_renderer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -80,6 +80,10 @@ void RE_SetWorldVisData( const byte * ) { }
void RE_EndRegistration() { }
void RE_ClearScene() { }
void RE_AddRefEntityToScene( const refEntity_t * ) { }
void RE_SyncRefEntities( const std::vector<EntityUpdate>& ) {}
std::vector<LerpTagSync> RE_SyncLerpTags( const std::vector<LerpTagUpdate>& ) {
return {};
}
int R_LightForPoint( vec3_t, vec3_t, vec3_t, vec3_t )
{
return 0;
Expand Down Expand Up @@ -209,6 +213,9 @@ refexport_t *GetRefAPI( int, refimport_t* )

re.ClearScene = RE_ClearScene;
re.AddRefEntityToScene = RE_AddRefEntityToScene;
re.SyncRefEntities = RE_SyncRefEntities;
re.SyncLerpTags = RE_SyncLerpTags;

re.LightForPoint = R_LightForPoint;

re.AddPolyToScene = RE_AddPolyToScene;
Expand All @@ -231,7 +238,6 @@ refexport_t *GetRefAPI( int, refimport_t* )

re.MarkFragments = R_MarkFragments;

re.LerpTag = R_LerpTag;
re.ModelBounds = R_ModelBounds;

re.RemapShader = R_RemapShader;
Expand Down
Loading
Loading