More toys for map-loading plugins.

git-svn-id: https://svn.code.sf.net/p/fteqw/code/trunk@6106 fc73d0e0-1445-4013-8a0c-d673dee63da5
This commit is contained in:
Spoike 2021-11-03 20:31:52 +00:00
parent a9a4e3c358
commit 8212ead238
8 changed files with 152 additions and 1 deletions

View file

@ -2174,6 +2174,19 @@ entity_t *V_AddEntity(entity_t *in)
return ent;
}
entity_t *V_AddNewEntity(void)
{
entity_t *ent;
if (cl_numvisedicts == cl_maxvisedicts)
{
cl_expandvisents = true;
return NULL; // object list is full
}
ent = &cl_visedicts[cl_numvisedicts];
cl_numvisedicts++;
return ent;
}
/*
void VQ2_AddLerpEntity(entity_t *in) //a convienience function
{

View file

@ -569,6 +569,7 @@ int Mod_RegisterModelFormatMagic(void *module, const char *formatname, qbyte *ma
void Mod_UnRegisterModelFormat(void *module, int idx);
void Mod_UnRegisterAllModelFormats(void *module);
void Mod_ModelLoaded(void *ctx, void *data, size_t a, size_t b);
void Mod_SubmodelLoaded(struct model_s *mod, int state);
#ifdef RUNTIMELIGHTING
struct relight_ctx_s;

View file

@ -36,6 +36,7 @@ void V_UpdatePalette (qboolean force);
void V_ClearCShifts (void);
void V_ClearEntity(entity_t *e);
entity_t *V_AddEntity(entity_t *in);
entity_t *V_AddNewEntity(void);
void VQ2_AddLerpEntity(entity_t *in);
void V_AddAxisEntity(entity_t *in);
void CLQ1_AddShadow(entity_t *ent);

View file

@ -870,6 +870,35 @@ static void BIH_RecursiveTrace (struct bihtrace_s *fte_restrict tr, const struct
if (node->data.contents & tr->hitcontents)
BIH_ClipToTriangle(tr, &node->data);
return;
case BIH_MODEL:
{
trace_t sub;
vec3_t start_l;
vec3_t end_l;
VectorSubtract (tr->startpos, node->data.mesh.tr->origin, start_l);
VectorSubtract (tr->endpos, node->data.mesh.tr->origin, end_l);
node->data.mesh.model->funcs.NativeTrace(node->data.mesh.model, 0, NULLFRAMESTATE, node->data.mesh.tr->axis, start_l, end_l, tr->size.min, tr->size.max, tr->shape==shape_iscapsule, tr->hitcontents, &sub);
if (sub.truefraction < tr->trace.truefraction)
{
tr->trace.truefraction = sub.truefraction;
tr->trace.fraction = sub.fraction;
tr->trace.plane.dist = sub.plane.dist;
VectorCopy(sub.plane.normal, tr->trace.plane.normal);
tr->trace.surface = sub.surface;
tr->trace.contents = sub.contents;
tr->trace.startsolid |= sub.startsolid;
tr->trace.allsolid = sub.allsolid;
VectorAdd (sub.endpos, node->data.mesh.tr->origin, tr->trace.endpos);
}
else
{
tr->trace.startsolid |= sub.startsolid;
tr->trace.allsolid &= sub.allsolid;
}
}
return;
case BIH_GROUP:
{
int i;
@ -1140,6 +1169,35 @@ static void BIH_RecursiveTest (struct bihtrace_s *fte_restrict tr, const struct
if (node->data.contents & tr->hitcontents)
BIH_TestToTriangle(tr, &node->data);
return;
case BIH_MODEL:
{ //lame...
trace_t sub;
vec3_t start_l;
vec3_t end_l;
VectorSubtract (tr->startpos, node->data.mesh.tr->origin, start_l);
VectorSubtract (tr->endpos, node->data.mesh.tr->origin, end_l);
node->data.mesh.model->funcs.NativeTrace(node->data.mesh.model, 0, NULLFRAMESTATE, node->data.mesh.tr->axis, start_l, end_l, tr->size.min, tr->size.max, tr->shape==shape_iscapsule, tr->hitcontents, &sub);
if (sub.truefraction < tr->trace.truefraction)
{
tr->trace.truefraction = sub.truefraction;
tr->trace.fraction = sub.fraction;
tr->trace.plane.dist = sub.plane.dist;
VectorCopy(sub.plane.normal, tr->trace.plane.normal);
tr->trace.surface = sub.surface;
tr->trace.contents = sub.contents;
tr->trace.startsolid |= sub.startsolid;
tr->trace.allsolid = sub.allsolid;
VectorAdd (sub.endpos, node->data.mesh.tr->origin, tr->trace.endpos);
}
else
{
tr->trace.startsolid |= sub.startsolid;
tr->trace.allsolid &= sub.allsolid;
}
}
return;
case BIH_GROUP:
{
int i;
@ -1403,6 +1461,12 @@ restart:
#endif
case BIH_TRIANGLE:
return 0;
case BIH_MODEL:
{
vec3_t pos;
VectorSubtract (p, node->data.mesh.tr->origin, pos);
return node->data.mesh.model->funcs.PointContents(node->data.mesh.model, node->data.mesh.tr->axis, pos);
}
case BIH_GROUP:
{
int i;

View file

@ -71,6 +71,7 @@ enum bihtype_e
BIH_TRISOUP,
#endif
BIH_TRIANGLE,
BIH_MODEL,
};
struct bihdata_s
{
@ -88,6 +89,14 @@ struct bihdata_s
index_t *indexes; //might be better to just bake 3 indexes instead of using a pointer to them
vecV_t *xyz;
} tri;
struct {
model_t *model;
struct bihtransform_s
{
vec3_t axis[3];
vec3_t origin;
} *tr;
} mesh;
};
};
struct bihleaf_s

View file

@ -223,6 +223,7 @@ typedef struct galiasinfo_s
} galiasinfo_t;
struct terrainfuncs_s;
struct bihleaf_s;
typedef struct modplugfuncs_s
{
int version;
@ -252,6 +253,17 @@ typedef struct modplugfuncs_s
void (QDECL *NormaliseTextureVectors)(vec3_t *n, vec3_t *s, vec3_t *t, int v, qboolean calcnorms);
model_t *(QDECL *GetModel)(const char *identifier, enum mlverbosity_e verbosity);
model_t *(QDECL *BeginSubmodelLoad)(const char *identifier);
qboolean (*LoadEntities)(struct model_s *mod, const char *entdata, size_t entdatasize);
void (*LoadMapArchive)(struct model_s *mod, void *archivedata, size_t archivesize);
void (*BIH_Build) (struct model_s *mod, struct bihleaf_s *leafs, size_t numleafs);
void (*BIH_BuildAlias) (struct model_s *mod, galiasinfo_t *meshes);
size_t (*ClipPlaneToBrush)(vecV_t *points, size_t maxpoints, void *planes, size_t planestride, size_t numplanes, vec4_t face);
shader_t *(*RegisterBasicShader)(struct model_s *mod, const char *texname, unsigned int usageflags, const char *shadertext, uploadfmt_t pixelfmt, unsigned int width, unsigned int height, void *pixeldata, void *palettedata);
void (*Batches_Build)(struct model_s *mod, builddata_t *bd);
void (*RenderDynamicLightmaps) (struct msurface_s *surf);
entity_t *(*NewSceneEntity) (void);
void (*EndSubmodelLoad)(struct model_s *submod, int modelloadstate);
#define plugmodfuncs_name "Models"
} plugmodfuncs_t;
#define MODPLUGFUNCS_VERSION 2

View file

@ -5,6 +5,7 @@
#include "quakedef.h"
#include "fs.h"
#include "vr.h"
#include "com_bih.h"
#define FTEENGINE
#include "../plugins/plugin.h"
@ -2088,7 +2089,26 @@ static void *QDECL PlugBI_GetEngineInterface(const char *interfacename, size_t s
#endif
Mod_AccumulateTextureVectors,
Mod_NormaliseTextureVectors,
Mod_ForName
Mod_ForName,
Mod_FindName,
Mod_LoadEntitiesBlob,
Mod_LoadMapArchive,
BIH_Build,
BIH_BuildAlias,
Fragment_ClipPlaneToBrush,
#ifdef HAVE_CLIENT
Mod_RegisterBasicShader,
Mod_Batches_Build,
Surf_RenderDynamicLightmaps,
V_AddNewEntity,
#else
NULL,
NULL,
NULL,
NULL,
#endif
Mod_SubmodelLoaded,
};
if (structsize == sizeof(funcs))
return &funcs;

View file

@ -1063,6 +1063,10 @@ void Mod_ModelLoaded(void *ctx, void *data, size_t a, size_t b)
break;
}
}
void Mod_SubmodelLoaded(model_t *mod, int state)
{
COM_AddWork(WG_MAIN, Mod_ModelLoaded, mod, NULL, MLS_LOADED, 0);
}
/*
==================
Mod_LoadModel
@ -3234,6 +3238,33 @@ void Mod_Batches_Build(model_t *mod, builddata_t *bd)
if (BE_GenBrushModelVBO)
BE_GenBrushModelVBO(mod);
}
shader_t *Mod_RegisterBasicShader(struct model_s *mod, const char *texname, unsigned int usageflags, const char *shadertext, uploadfmt_t pixelfmt, unsigned int width, unsigned int height, void *pixeldata, void *palettedata)
{
shader_t *s;
unsigned int maps;
char mapbase[64];
if (shadertext)
s = R_RegisterShader(texname, usageflags, shadertext);
else if (mod->type == mod_brush)
s = R_RegisterCustom(mod, texname, usageflags, Shader_DefaultSkin, NULL);
else
s = R_RegisterCustom(mod, texname, usageflags, Shader_DefaultBSPLM, NULL);
maps = 0;
maps |= SHADER_HASPALETTED;
maps |= SHADER_HASDIFFUSE;
if (r_fb_bmodels.ival)
maps |= SHADER_HASFULLBRIGHT;
if (r_loadbumpmapping || s->defaulttextures->reflectcube)
maps |= SHADER_HASNORMALMAP;
if (gl_specular.ival)
maps |= SHADER_HASGLOSS;
COM_FileBase(mod->name, mapbase, sizeof(mapbase));
R_BuildLegacyTexnums(s, texname, mapbase, maps, 0, pixelfmt, width, height, pixeldata, palettedata);
return s;
}
#endif