diff --git a/src/nodebuild_utility.cpp b/src/nodebuild_utility.cpp index 85dea384f..b6115f4c8 100644 --- a/src/nodebuild_utility.cpp +++ b/src/nodebuild_utility.cpp @@ -50,6 +50,7 @@ #include "i_system.h" #include "po_man.h" #include "r_state.h" +#include "g_levellocals.h" #include "math/cmath.h" static const int PO_LINE_START = 1; diff --git a/src/p_sectors.cpp b/src/p_sectors.cpp index daccbf06f..20489057c 100644 --- a/src/p_sectors.cpp +++ b/src/p_sectors.cpp @@ -1826,6 +1826,145 @@ DEFINE_ACTION_FUNCTION(_Sector, NextLowestFloorAt) ACTION_RETURN_INT(ndx); } + //=========================================================================== + // + // + // + //=========================================================================== + + DEFINE_ACTION_FUNCTION(_Side, GetTexture) + { + PARAM_SELF_STRUCT_PROLOGUE(side_t); + PARAM_INT(which); + ACTION_RETURN_INT(self->GetTexture(which).GetIndex()); + } + + DEFINE_ACTION_FUNCTION(_Side, SetTexture) + { + PARAM_SELF_STRUCT_PROLOGUE(side_t); + PARAM_INT(which); + PARAM_INT(tex); + self->SetTexture(which, FSetTextureID(tex)); + return 0; + } + + DEFINE_ACTION_FUNCTION(_Side, SetTextureXOffset) + { + PARAM_SELF_STRUCT_PROLOGUE(side_t); + PARAM_INT(which); + PARAM_FLOAT(ofs); + self->SetTextureXOffset(which, ofs); + return 0; + } + + DEFINE_ACTION_FUNCTION(_Side, AddTextureXOffset) + { + PARAM_SELF_STRUCT_PROLOGUE(side_t); + PARAM_INT(which); + PARAM_FLOAT(ofs); + self->AddTextureXOffset(which, ofs); + return 0; + } + + DEFINE_ACTION_FUNCTION(_Side, GetTextureXOffset) + { + PARAM_SELF_STRUCT_PROLOGUE(side_t); + PARAM_INT(which); + ACTION_RETURN_FLOAT(self->GetTextureXOffset(which)); + } + + DEFINE_ACTION_FUNCTION(_Side, SetTextureYOffset) + { + PARAM_SELF_STRUCT_PROLOGUE(side_t); + PARAM_INT(which); + PARAM_FLOAT(ofs); + self->SetTextureYOffset(which, ofs); + return 0; + } + + DEFINE_ACTION_FUNCTION(_Side, AddTextureYOffset) + { + PARAM_SELF_STRUCT_PROLOGUE(side_t); + PARAM_INT(which); + PARAM_FLOAT(ofs); + self->AddTextureYOffset(which, ofs); + return 0; + } + + DEFINE_ACTION_FUNCTION(_Side, GetTextureYOffset) + { + PARAM_SELF_STRUCT_PROLOGUE(side_t); + PARAM_INT(which); + ACTION_RETURN_FLOAT(self->GetTextureYOffset(which)); + } + + DEFINE_ACTION_FUNCTION(_Side, SetTextureXScale) + { + PARAM_SELF_STRUCT_PROLOGUE(side_t); + PARAM_INT(which); + PARAM_FLOAT(ofs); + self->SetTextureXScale(which, ofs); + return 0; + } + + DEFINE_ACTION_FUNCTION(_Side, MultiplyTextureXScale) + { + PARAM_SELF_STRUCT_PROLOGUE(side_t); + PARAM_INT(which); + PARAM_FLOAT(ofs); + self->MultiplyTextureXScale(which, ofs); + return 0; + } + + DEFINE_ACTION_FUNCTION(_Side, GetTextureXScale) + { + PARAM_SELF_STRUCT_PROLOGUE(side_t); + PARAM_INT(which); + ACTION_RETURN_FLOAT(self->GetTextureXScale(which)); + } + + DEFINE_ACTION_FUNCTION(_Side, SetTextureYScale) + { + PARAM_SELF_STRUCT_PROLOGUE(side_t); + PARAM_INT(which); + PARAM_FLOAT(ofs); + self->SetTextureYScale(which, ofs); + return 0; + } + + DEFINE_ACTION_FUNCTION(_Side, MultiplyTextureYScale) + { + PARAM_SELF_STRUCT_PROLOGUE(side_t); + PARAM_INT(which); + PARAM_FLOAT(ofs); + self->MultiplyTextureYScale(which, ofs); + return 0; + } + + DEFINE_ACTION_FUNCTION(_Side, GetTextureYScale) + { + PARAM_SELF_STRUCT_PROLOGUE(side_t); + PARAM_INT(which); + ACTION_RETURN_FLOAT(self->GetTextureYScale(which)); + } + + DEFINE_ACTION_FUNCTION(_Side, V1) + { + PARAM_SELF_STRUCT_PROLOGUE(side_t); + ACTION_RETURN_POINTER(self->V1()); + } + + DEFINE_ACTION_FUNCTION(_Side, V2) + { + PARAM_SELF_STRUCT_PROLOGUE(side_t); + ACTION_RETURN_POINTER(self->V2()); + } + + DEFINE_ACTION_FUNCTION(_Side, Index) + { + PARAM_SELF_STRUCT_PROLOGUE(side_t); + ACTION_RETURN_INT(self->Index()); + } //=========================================================================== // @@ -2157,6 +2296,11 @@ DEFINE_FIELD_X(Line, line_t, locknumber) DEFINE_FIELD_X(Line, line_t, portalindex) DEFINE_FIELD_X(Line, line_t, portaltransferred) +DEFINE_FIELD_X(Side, side_t, sector) +DEFINE_FIELD_X(Side, side_t, linedef) +DEFINE_FIELD_X(Side, side_t, Light) +DEFINE_FIELD_X(Side, side_t, Flags) + DEFINE_FIELD_X(Secplane, secplane_t, normal) DEFINE_FIELD_X(Secplane, secplane_t, D) DEFINE_FIELD_X(Secplane, secplane_t, negiC) diff --git a/src/po_man.cpp b/src/po_man.cpp index d9e15d1be..45b459281 100644 --- a/src/po_man.cpp +++ b/src/po_man.cpp @@ -40,17 +40,6 @@ // TYPES ------------------------------------------------------------------- -inline vertex_t *side_t::V1() const -{ - return this == linedef->sidedef[0]? linedef->v1 : linedef->v2; -} - -inline vertex_t *side_t::V2() const -{ - return this == linedef->sidedef[0]? linedef->v2 : linedef->v1; -} - - class DRotatePoly : public DPolyAction { DECLARE_CLASS (DRotatePoly, DPolyAction) @@ -149,8 +138,6 @@ static void ReleaseAllPolyNodes(); // EXTERNAL DATA DECLARATIONS ---------------------------------------------- -extern seg_t *segs; - // PUBLIC DATA DEFINITIONS ------------------------------------------------- polyblock_t **PolyBlockMap; diff --git a/src/r_defs.h b/src/r_defs.h index 66fafe4cd..ce6890311 100644 --- a/src/r_defs.h +++ b/src/r_defs.h @@ -1343,6 +1343,16 @@ struct line_t int Index() const; }; +inline vertex_t *side_t::V1() const +{ + return this == linedef->sidedef[0] ? linedef->v1 : linedef->v2; +} + +inline vertex_t *side_t::V2() const +{ + return this == linedef->sidedef[0] ? linedef->v2 : linedef->v1; +} + // phares 3/14/98 // // Sector list node showing all sectors an object appears in. diff --git a/src/scripting/thingdef_data.cpp b/src/scripting/thingdef_data.cpp index 30b998beb..0effa0c20 100644 --- a/src/scripting/thingdef_data.cpp +++ b/src/scripting/thingdef_data.cpp @@ -726,6 +726,10 @@ void InitThingdef() linestruct->Size = sizeof(line_t); linestruct->Align = alignof(line_t); + auto sidestruct = NewNativeStruct("Side", nullptr); + sidestruct->Size = sizeof(side_t); + sidestruct->Align = alignof(side_t); + // set up the lines array in the sector struct. This is a bit messy because the type system is not prepared to handle a pointer to an array of pointers to a native struct even remotely well... // As a result, the size has to be set to something large and arbritrary because it can change between maps. This will need some serious improvement when things get cleaned up. @@ -754,6 +758,7 @@ void InitThingdef() // Add the sector array to LevelLocals. lstruct->AddNativeField("sectors", NewPointer(NewResizableArray(sectorstruct), false), myoffsetof(FLevelLocals, sectors), VARF_Native); lstruct->AddNativeField("lines", NewPointer(NewResizableArray(linestruct), false), myoffsetof(FLevelLocals, lines), VARF_Native); + lstruct->AddNativeField("sides", NewPointer(NewResizableArray(sidestruct), false), myoffsetof(FLevelLocals, sides), VARF_Native); // set up a variable for the DEH data PStruct *dstruct = NewNativeStruct("DehInfo", nullptr); diff --git a/wadsrc/static/zscript/base.txt b/wadsrc/static/zscript/base.txt index 3dc846f0b..232becccc 100644 --- a/wadsrc/static/zscript/base.txt +++ b/wadsrc/static/zscript/base.txt @@ -190,6 +190,56 @@ struct Vertex native native readonly Vector2 p; } +struct Side +{ + enum ETexpart + { + top=0, + mid=1, + bottom=2 + }; + + enum EWallFlags + { + WALLF_ABSLIGHTING = 1, // Light is absolute instead of relative + WALLF_NOAUTODECALS = 2, // Do not attach impact decals to this wall + WALLF_NOFAKECONTRAST = 4, // Don't do fake contrast for this wall in side_t::GetLightLevel + WALLF_SMOOTHLIGHTING = 8, // Similar to autocontrast but applies to all angles. + WALLF_CLIP_MIDTEX = 16, // Like the line counterpart, but only for this side. + WALLF_WRAP_MIDTEX = 32, // Like the line counterpart, but only for this side. + WALLF_POLYOBJ = 64, // This wall belongs to a polyobject. + WALLF_LIGHT_FOG = 128, // This wall's Light is used even in fog. + }; + + native Sector sector; // Sector the SideDef is facing. + //DBaseDecal* AttachedDecals; // [RH] Decals bound to the wall + native Line linedef; + native int16 Light; + native uint8 Flags; + + native TextureID GetTexture(int which); + native void SetTexture(int which, TextureID tex); + native void SetTextureXOffset(int which, double offset); + native double GetTextureXOffset(int which); + native void AddTextureXOffset(int which, double delta); + native void SetTextureYOffset(int which, double offset); + native double GetTextureYOffset(int which); + native void AddTextureYOffset(int which, double delta); + native void SetTextureXScale(int which, double scale); + native double GetTextureXScale(int which); + native void MultiplyTextureXScale(int which, double delta); + native void SetTextureYScale(int which, double scale); + native double GetTextureYScale(int which); + native void MultiplyTextureYScale(int which, double delta); + //native DInterpolation *SetInterpolation(int position); + //native void StopInterpolation(int position); + + native Vertex V1(); + native Vertex V2(); + + native int Index(); +}; + struct Line native { enum ELineFlags @@ -302,6 +352,12 @@ struct Sector native //SectorEffect ceilingdata; //SectorEffect lightingdata; + enum EPlane + { + floor, + ceiling + }; + enum EInterpolationType { CeilingMove,