mirror of
https://git.do.srb2.org/STJr/ZoneBuilder.git
synced 2025-02-20 19:02:34 +00:00
Added functionality for rendering only sides/planes of a 3D floor
This commit is contained in:
parent
f54af8087f
commit
36ec727743
5 changed files with 35 additions and 23 deletions
|
@ -39,29 +39,29 @@ namespace CodeImp.DoomBuilder.IO
|
||||||
public SRB2MapSetIO(WAD wad, MapManager manager) : base(wad, manager)
|
public SRB2MapSetIO(WAD wad, MapManager manager) : base(wad, manager)
|
||||||
{
|
{
|
||||||
//Dictionary contents: Type, flags, translucency, flags when noclimb is active
|
//Dictionary contents: Type, flags, translucency, flags when noclimb is active
|
||||||
//Type: 1 = solid, 2 = water, 3 = intangible, +4 = render insides
|
//Type: 1 = solid, 2 = water, 3 = intangible, +4 = render insides, +64 = don't render planes, +128 = don't render sides
|
||||||
//Flags: 1 = disable lighting effects (e.g. shadows), 2 = restrict lighting effects to insides, 4 = fog
|
//Flags: 1 = disable lighting effects (e.g. shadows), 2 = restrict lighting effects to insides, 4 = fog
|
||||||
//Translucency: 0 = invisible, 1 = read from front upper texture, 2 = opaque
|
//Translucency: 0 = invisible, 1 = read from front upper texture, 2 = opaque
|
||||||
threeDFloorTypes = new Dictionary<int, int[]>() {
|
threeDFloorTypes = new Dictionary<int, int[]>() {
|
||||||
{ 100, new int[4] { 1, 0, 2, 0} },
|
{ 100, new int[4] { 1, 0, 2, 0} },
|
||||||
{ 101, new int[4] { 1, 1, 2, 1} },
|
{ 101, new int[4] { 1, 1, 2, 1} },
|
||||||
{ 102, new int[4] { 1, 1, 1, 1} },
|
{ 102, new int[4] { 1, 1, 1, 1} },
|
||||||
{ 103, new int[4] { 1, 1, 2, 1} },
|
{ 103, new int[4] { 65, 1, 2, 1} },
|
||||||
{ 104, new int[4] { 1, 1, 2, 0} },
|
{ 104, new int[4] { 129, 1, 2, 0} },
|
||||||
{ 105, new int[4] { 1, 1, 0, 1} },
|
{ 105, new int[4] { 1, 1, 0, 1} },
|
||||||
{ 120, new int[4] { 6, 0, 2, 2} },
|
{ 120, new int[4] { 6, 0, 2, 2} },
|
||||||
{ 121, new int[4] { 6, 0, 1, 2} },
|
{ 121, new int[4] { 6, 0, 1, 2} },
|
||||||
{ 122, new int[4] { 6, 0, 2, 2} },
|
{ 122, new int[4] { 134, 0, 2, 2} },
|
||||||
{ 123, new int[4] { 6, 0, 1, 2} },
|
{ 123, new int[4] { 134, 0, 1, 2} },
|
||||||
{ 124, new int[4] { 6, 0, 1, 2} },
|
{ 124, new int[4] { 6, 0, 1, 2} },
|
||||||
{ 125, new int[4] { 6, 0, 1, 2} },
|
{ 125, new int[4] { 134, 0, 1, 2} },
|
||||||
{ 140, new int[4] { 1, 0, 2, 1} },
|
{ 140, new int[4] { 1, 0, 2, 1} },
|
||||||
{ 141, new int[4] { 1, 0, 1, 1} },
|
{ 141, new int[4] { 1, 0, 1, 1} },
|
||||||
{ 142, new int[4] { 1, 0, 1, 1} },
|
{ 142, new int[4] { 129, 0, 1, 1} },
|
||||||
{ 143, new int[4] { 1, 0, 2, 1} },
|
{ 143, new int[4] { 1, 0, 2, 1} },
|
||||||
{ 144, new int[4] { 1, 0, 1, 1} },
|
{ 144, new int[4] { 1, 0, 1, 1} },
|
||||||
{ 145, new int[4] { 1, 0, 1, 1} },
|
{ 145, new int[4] { 129, 0, 1, 1} },
|
||||||
{ 146, new int[4] { 1, 0, 2, 1} },
|
{ 146, new int[4] { 65, 0, 2, 1} },
|
||||||
{ 150, new int[4] { 1, 0, 2, 0} },
|
{ 150, new int[4] { 1, 0, 2, 0} },
|
||||||
{ 151, new int[4] { 1, 0, 2, 0} },
|
{ 151, new int[4] { 1, 0, 2, 0} },
|
||||||
{ 152, new int[4] { 1, 0, 2, 0} },
|
{ 152, new int[4] { 1, 0, 2, 0} },
|
||||||
|
@ -88,7 +88,7 @@ namespace CodeImp.DoomBuilder.IO
|
||||||
{ 202, new int[4] { 7, 5, 2, 5} },
|
{ 202, new int[4] { 7, 5, 2, 5} },
|
||||||
{ 220, new int[4] { 3, 0, 2, 0} },
|
{ 220, new int[4] { 3, 0, 2, 0} },
|
||||||
{ 221, new int[4] { 3, 1, 1, 0} },
|
{ 221, new int[4] { 3, 1, 1, 0} },
|
||||||
{ 222, new int[4] { 3, 1, 2, 0} },
|
{ 222, new int[4] { 67, 1, 2, 0} },
|
||||||
{ 223, new int[4] { 3, 1, 0, 1} },
|
{ 223, new int[4] { 3, 1, 0, 1} },
|
||||||
{ 250, new int[4] { 1, 0, 2, 0} },
|
{ 250, new int[4] { 1, 0, 2, 0} },
|
||||||
{ 251, new int[4] { 1, 0, 2, 0} },
|
{ 251, new int[4] { 1, 0, 2, 0} },
|
||||||
|
|
|
@ -782,7 +782,9 @@ namespace CodeImp.DoomBuilder.Map
|
||||||
int value = Convert.ToInt32(tex, 16);
|
int value = Convert.ToInt32(tex, 16);
|
||||||
bool exists = (value & 0x1) == 0x1; //FF_EXISTS
|
bool exists = (value & 0x1) == 0x1; //FF_EXISTS
|
||||||
bool solid = ((value & 0x2) == 0x2) || ((value & 0x4) == 0x4); //FF_BLOCKPLAYER/FF_BLOCKOTHERS/FF_SOLID
|
bool solid = ((value & 0x2) == 0x2) || ((value & 0x4) == 0x4); //FF_BLOCKPLAYER/FF_BLOCKOTHERS/FF_SOLID
|
||||||
bool render = ((value & 0x8) == 0x8) || ((value & 0x10) == 0x10); //FF_RENDERSIDES/FF_RENDERPLANES/FF_RENDERALL
|
bool rendersides = (value & 0x8) == 0x8; //FF_RENDERSIDES
|
||||||
|
bool renderplanes = (value & 0x10) == 0x10; //FF_RENDERPLANES
|
||||||
|
bool render = rendersides || renderplanes;
|
||||||
bool water = (value & 0x20) == 0x20; //FF_SWIMMABLE
|
bool water = (value & 0x20) == 0x20; //FF_SWIMMABLE
|
||||||
bool noshade = (value & 0x40) == 0x40; //FF_NOSHADE
|
bool noshade = (value & 0x40) == 0x40; //FF_NOSHADE
|
||||||
bool translucent = (value & 0x1000) == 0x1000; //FF_TRANSLUCENT
|
bool translucent = (value & 0x1000) == 0x1000; //FF_TRANSLUCENT
|
||||||
|
@ -793,6 +795,8 @@ namespace CodeImp.DoomBuilder.Map
|
||||||
{
|
{
|
||||||
Args[1] = water ? 2 : (solid ? 1 : 3);
|
Args[1] = water ? 2 : (solid ? 1 : 3);
|
||||||
if (inside) Args[1] += 4;
|
if (inside) Args[1] += 4;
|
||||||
|
if (!renderplanes) Args[1] += 64;
|
||||||
|
if (!rendersides) Args[1] += 128;
|
||||||
}
|
}
|
||||||
if (noshade) Args[2] += 1;
|
if (noshade) Args[2] += 1;
|
||||||
if (doubleshadow) Args[2] += 2;
|
if (doubleshadow) Args[2] += 2;
|
||||||
|
|
|
@ -51,6 +51,8 @@ namespace CodeImp.DoomBuilder.BuilderModes
|
||||||
public bool IgnoreBottomHeight { get { return ignorebottomheight; } } //mxd
|
public bool IgnoreBottomHeight { get { return ignorebottomheight; } } //mxd
|
||||||
public bool Sloped3dFloor { get { return sloped3dfloor; } } //mxd
|
public bool Sloped3dFloor { get { return sloped3dfloor; } } //mxd
|
||||||
public bool ClipSidedefs { get { return clipsides; } } //mxd
|
public bool ClipSidedefs { get { return clipsides; } } //mxd
|
||||||
|
public bool DontRenderPlanes { get { return General.Map.SRB2 && (linedef.Args[1] & (int)FloorTypes.DontRenderPlanes) == (int)FloorTypes.DontRenderPlanes; } }
|
||||||
|
public bool DontRenderSides { get { return General.Map.SRB2 && (linedef.Args[1] & (int)FloorTypes.DontRenderSides) == (int)FloorTypes.DontRenderSides; } }
|
||||||
|
|
||||||
//mxd. 3D-Floor Flags
|
//mxd. 3D-Floor Flags
|
||||||
[Flags]
|
[Flags]
|
||||||
|
@ -77,7 +79,10 @@ namespace CodeImp.DoomBuilder.BuilderModes
|
||||||
RenderInside = 4,
|
RenderInside = 4,
|
||||||
HiTagIsLineID = 8,
|
HiTagIsLineID = 8,
|
||||||
InvertVisibilityRules = 16,
|
InvertVisibilityRules = 16,
|
||||||
InvertShootabilityRules = 32
|
InvertShootabilityRules = 32,
|
||||||
|
//Fake flags added for SRB2
|
||||||
|
DontRenderPlanes = 64,
|
||||||
|
DontRenderSides = 128
|
||||||
}
|
}
|
||||||
|
|
||||||
// Constructor
|
// Constructor
|
||||||
|
@ -154,8 +159,8 @@ namespace CodeImp.DoomBuilder.BuilderModes
|
||||||
}
|
}
|
||||||
|
|
||||||
// Apply alpha
|
// Apply alpha
|
||||||
floor.alpha = alpha;
|
floor.alpha = DontRenderPlanes ? 0 : alpha;
|
||||||
ceiling.alpha = alpha;
|
ceiling.alpha = DontRenderPlanes ? 0 : alpha;
|
||||||
|
|
||||||
//mxd
|
//mxd
|
||||||
floor.extrafloor = true;
|
floor.extrafloor = true;
|
||||||
|
|
|
@ -277,15 +277,16 @@ namespace CodeImp.DoomBuilder.BuilderModes
|
||||||
List<WorldVertex> verts = CreatePolygonVertices(polygons, tp, sd, lightvalue, lightabsolute);
|
List<WorldVertex> verts = CreatePolygonVertices(polygons, tp, sd, lightvalue, lightabsolute);
|
||||||
if(verts.Count > 2)
|
if(verts.Count > 2)
|
||||||
{
|
{
|
||||||
if(extrafloor.Sloped3dFloor) this.RenderPass = RenderPass.Mask; //mxd
|
if (extrafloor.Sloped3dFloor) this.RenderPass = RenderPass.Mask; //mxd
|
||||||
else if(extrafloor.RenderAdditive) this.RenderPass = RenderPass.Additive; //mxd
|
else if(extrafloor.RenderAdditive) this.RenderPass = RenderPass.Additive; //mxd
|
||||||
else if(extrafloor.Alpha < 255) this.RenderPass = RenderPass.Alpha;
|
else if(extrafloor.Alpha < 255 || extrafloor.DontRenderSides) this.RenderPass = RenderPass.Alpha;
|
||||||
else this.RenderPass = RenderPass.Mask;
|
else this.RenderPass = RenderPass.Mask;
|
||||||
|
|
||||||
if(extrafloor.Alpha < 255)
|
if(extrafloor.Alpha < 255 || extrafloor.DontRenderSides)
|
||||||
{
|
{
|
||||||
// Apply alpha to vertices
|
// Apply alpha to vertices
|
||||||
byte alpha = (byte)General.Clamp(extrafloor.Alpha, 0, 255);
|
byte alpha = (byte)General.Clamp(extrafloor.Alpha, 0, 255);
|
||||||
|
if (extrafloor.DontRenderSides) alpha = 0;
|
||||||
if(alpha < 255)
|
if(alpha < 255)
|
||||||
{
|
{
|
||||||
for(int i = 0; i < verts.Count; i++)
|
for(int i = 0; i < verts.Count; i++)
|
||||||
|
|
|
@ -206,7 +206,9 @@ namespace CodeImp.DoomBuilder.BuilderModes
|
||||||
|
|
||||||
//mxd. This calculates light with doom-style wall shading
|
//mxd. This calculates light with doom-style wall shading
|
||||||
PixelColor wallbrightness = PixelColor.FromInt(mode.CalculateBrightness(lightlevel, Sidedef));
|
PixelColor wallbrightness = PixelColor.FromInt(mode.CalculateBrightness(lightlevel, Sidedef));
|
||||||
int wallcolor = PixelColor.Modulate(levelcolor, wallbrightness).WithAlpha((byte)extrafloor.Alpha).ToInt();
|
byte alpha = (byte)extrafloor.Alpha;
|
||||||
|
if (extrafloor.DontRenderSides) alpha = 0;
|
||||||
|
int wallcolor = PixelColor.Modulate(levelcolor, wallbrightness).WithAlpha(alpha).ToInt();
|
||||||
fogfactor = CalculateFogDensity(lightlevel);
|
fogfactor = CalculateFogDensity(lightlevel);
|
||||||
|
|
||||||
// Cut off the part above the 3D floor and below the 3D ceiling
|
// Cut off the part above the 3D floor and below the 3D ceiling
|
||||||
|
@ -258,9 +260,9 @@ namespace CodeImp.DoomBuilder.BuilderModes
|
||||||
List<WorldVertex> verts = CreatePolygonVertices(polygons, tp, sd, lightvalue, lightabsolute);
|
List<WorldVertex> verts = CreatePolygonVertices(polygons, tp, sd, lightvalue, lightabsolute);
|
||||||
if(verts.Count > 2)
|
if(verts.Count > 2)
|
||||||
{
|
{
|
||||||
if(extrafloor.Sloped3dFloor) this.RenderPass = RenderPass.Mask; //mxd
|
if (extrafloor.Sloped3dFloor) this.RenderPass = RenderPass.Mask; //mxd
|
||||||
else if(extrafloor.RenderAdditive) this.RenderPass = RenderPass.Additive; //mxd
|
else if(extrafloor.RenderAdditive) this.RenderPass = RenderPass.Additive; //mxd
|
||||||
else if(extrafloor.Alpha < 255) this.RenderPass = RenderPass.Alpha;
|
else if(extrafloor.Alpha < 255 || extrafloor.DontRenderSides) this.RenderPass = RenderPass.Alpha;
|
||||||
else this.RenderPass = RenderPass.Mask;
|
else this.RenderPass = RenderPass.Mask;
|
||||||
|
|
||||||
//mxd. Inner sides always have extrafloor color
|
//mxd. Inner sides always have extrafloor color
|
||||||
|
|
Loading…
Reference in a new issue