diff --git a/src/gl/models/gl_models.cpp b/src/gl/models/gl_models.cpp index 47283b51aa..fe974f4dfd 100644 --- a/src/gl/models/gl_models.cpp +++ b/src/gl/models/gl_models.cpp @@ -787,6 +787,10 @@ void gl_InitModels() map[c]=1; } } + else if (sc.Compare("dontcullbackfaces")) + { + smf.flags |= MDL_DONTCULLBACKFACES; + } else { sc.ScriptMessage("Unrecognized string \"%s\"", sc.String); @@ -949,8 +953,9 @@ void gl_RenderModel(GLSprite * spr) gl_RenderState.EnableTexture(true); // [BB] In case the model should be rendered translucent, do back face culling. // This solves a few of the problems caused by the lack of depth sorting. + // [Nash] Don't do back face culling if explicitly specified in MODELDEF // TO-DO: Implement proper depth sorting. - if (!( spr->actor->RenderStyle == LegacyRenderStyles[STYLE_Normal] )) + if (!(spr->actor->RenderStyle == LegacyRenderStyles[STYLE_Normal]) && !(smf->flags & MDL_DONTCULLBACKFACES)) { glEnable(GL_CULL_FACE); glFrontFace(GL_CW); @@ -1012,6 +1017,9 @@ void gl_RenderModel(GLSprite * spr) // Model space => World space gl_RenderState.mModelMatrix.translate(spr->x, spr->z, spr->y ); + // [Nash] take SpriteRotation into account + angle += spr->actor->SpriteRotation.Degrees; + if (spr->actor->renderflags & RF_INTERPOLATEANGLES) { // [Nash] use interpolated angles diff --git a/src/gl/models/gl_models.h b/src/gl/models/gl_models.h index f0267b8913..c37b69b5ee 100644 --- a/src/gl/models/gl_models.h +++ b/src/gl/models/gl_models.h @@ -370,6 +370,7 @@ enum MDL_USEACTORPITCH = 32, MDL_USEACTORROLL = 64, MDL_BADROTATION = 128, + MDL_DONTCULLBACKFACES = 256, }; struct FSpriteModelFrame diff --git a/src/p_actionfunctions.cpp b/src/p_actionfunctions.cpp index 518d2fb631..69ca13f164 100644 --- a/src/p_actionfunctions.cpp +++ b/src/p_actionfunctions.cpp @@ -5012,7 +5012,7 @@ enum T_Flags DEFINE_ACTION_FUNCTION(AActor, A_Teleport) { PARAM_ACTION_PROLOGUE(AActor); - PARAM_STATE_DEF (teleport_state) + PARAM_STATE_ACTION_DEF (teleport_state) PARAM_CLASS_DEF (target_type, ASpecialSpot) PARAM_CLASS_DEF (fog_type, AActor) PARAM_INT_DEF (flags) @@ -5449,7 +5449,7 @@ DEFINE_ACTION_FUNCTION(AActor, A_Warp) PARAM_FLOAT_DEF(zofs) PARAM_ANGLE_DEF(angle) PARAM_INT_DEF(flags) - PARAM_STATE_DEF(success_state) + PARAM_STATE_ACTION_DEF(success_state) PARAM_FLOAT_DEF(heightoffset) PARAM_FLOAT_DEF(radiusoffset) PARAM_ANGLE_DEF(pitch) diff --git a/src/p_mobj.cpp b/src/p_mobj.cpp index 2650224be4..53491f235f 100644 --- a/src/p_mobj.cpp +++ b/src/p_mobj.cpp @@ -771,7 +771,7 @@ bool AActor::GiveInventory(PClassActor *type, int amount, bool givecheat) { bool result = true; - if (type != nullptr || !type->IsDescendantOf(RUNTIME_CLASS(AInventory))) return false; + if (type == nullptr || !type->IsDescendantOf(RUNTIME_CLASS(AInventory))) return false; AWeapon *savedPendingWeap = player != NULL ? player->PendingWeapon : NULL; bool hadweap = player != NULL ? player->ReadyWeapon != NULL : true; diff --git a/src/scripting/backend/codegen.cpp b/src/scripting/backend/codegen.cpp index c05ab6d644..71ecfc58c9 100644 --- a/src/scripting/backend/codegen.cpp +++ b/src/scripting/backend/codegen.cpp @@ -7863,7 +7863,7 @@ FxExpression *FxMemberFunctionCall::Resolve(FCompileContext& ctx) return x->Resolve(ctx); } - if (Self->ValueType->IsKindOf(RUNTIME_CLASS(PPointer))) + if (Self->ValueType->IsKindOf(RUNTIME_CLASS(PPointer)) && !Self->ValueType->IsKindOf(RUNTIME_CLASS(PClassPointer))) { auto ptype = static_cast(Self->ValueType)->PointedType; if (ptype->IsKindOf(RUNTIME_CLASS(PStruct)))