Merge remote-tracking branch 'gzdoom/master'

This commit is contained in:
Magnus Norddahl 2024-01-18 10:43:42 +01:00
commit 3cc38c1d14
21 changed files with 242 additions and 88 deletions

View file

@ -1826,7 +1826,8 @@ void S_SetSoundPaused(int state)
if ((state || i_soundinbackground) && !pauseext)
{
S_ResumeSound(true);
if (!paused)
S_ResumeSound(true);
if (GSnd != nullptr)
{
GSnd->SetInactive(SoundRenderer::INACTIVE_Active);

View file

@ -128,9 +128,15 @@ int FDirectory::AddDirectory(const char *dirpath, LumpFilterInfo* filter, FileSy
Printf(FSMessageLevel::Warning, "%s is larger than 2GB and will be ignored\n", entry.FilePath.c_str());
continue;
}
// for accessing the file we need to retain the original unaltered path.
// On Linux this is important because its file system is case sensitive,
// but even on Windows the Unicode normalization is destructive
// for some characters and cannot be used for file names.
// Examples for this are the Turkish 'i's or the German ß.
SystemFilePath[count] = stringpool->Strdup(entry.FilePathRel.c_str());
// for internal access we use the normalized form of the relative path.
// this is fine because the paths that get compared against this will also be normalized.
Entries[count].FileName = NormalizeFileName(entry.FilePathRel.c_str());
SystemFilePath[count] = Entries[count].FileName;
Entries[count].CompressedSize = Entries[count].Length = entry.Length;
Entries[count].Flags = RESFF_FULLPATH;
Entries[count].ResourceID = -1;

View file

@ -252,7 +252,7 @@ bool FileSystem::InitMultipleFiles (std::vector<std::string>& filenames, LumpFil
stringpool->shared = true; // will be used by all owned resource files.
// first, check for duplicates
if (allowduplicates)
if (!allowduplicates)
{
for (size_t i=0;i<filenames.size(); i++)
{

View file

@ -41,7 +41,9 @@ struct FSpriteModelFrame
float xrotate, yrotate, zrotate;
float rotationCenterX, rotationCenterY, rotationCenterZ;
float rotationSpeed;
private:
unsigned int flags;
public:
const void* type; // used for hashing, must point to something usable as identifier for the model's owner.
short sprite;
short frame;
@ -50,6 +52,9 @@ struct FSpriteModelFrame
// added pithoffset, rolloffset.
float pitchoffset, rolloffset; // I don't want to bother with type transformations, so I made this variables float.
bool isVoxel;
unsigned int getFlags(class DActorModelData * defs) const;
friend void InitModels();
friend void ParseModelDefLump(int Lump);
};

View file

@ -10,15 +10,15 @@ public:
virtual ModelRendererType GetType() const = 0;
virtual void BeginDrawModel(FRenderStyle style, FSpriteModelFrame *smf, const VSMatrix &objectToWorldMatrix, bool mirrored) = 0;
virtual void EndDrawModel(FRenderStyle style, FSpriteModelFrame *smf) = 0;
virtual void BeginDrawModel(FRenderStyle style, int smf_flags, const VSMatrix &objectToWorldMatrix, bool mirrored) = 0;
virtual void EndDrawModel(FRenderStyle style, int smf_flags) = 0;
virtual IModelVertexBuffer *CreateVertexBuffer(bool needindex, bool singleframe) = 0;
virtual VSMatrix GetViewToWorldMatrix() = 0;
virtual void BeginDrawHUDModel(FRenderStyle style, const VSMatrix &objectToWorldMatrix, bool mirrored, FSpriteModelFrame *smf) = 0;
virtual void EndDrawHUDModel(FRenderStyle style, FSpriteModelFrame *smf) = 0;
virtual void BeginDrawHUDModel(FRenderStyle style, const VSMatrix &objectToWorldMatrix, bool mirrored, int smf_flags) = 0;
virtual void EndDrawHUDModel(FRenderStyle style, int smf_flags) = 0;
virtual void SetInterpolation(double interpolation) = 0;
virtual void SetMaterial(FGameTexture *skin, bool clampNoFilter, FTranslationID translation) = 0;

View file

@ -54,7 +54,7 @@ std::vector<SingleFontData> LoadWidgetFontData(const std::string& name)
std::vector<SingleFontData> returnv;
if (!stricmp(name.c_str(), "notosans"))
{
returnv.resize(5);
returnv.resize(3);
returnv[0].fontdata = LoadFile("widgets/noto/notosans-regular.ttf");
returnv[1].fontdata = LoadFile("widgets/noto/notosansarmenian-regular.ttf");
returnv[2].fontdata = LoadFile("widgets/noto/notosansgeorgian-regular.ttf");
@ -62,6 +62,7 @@ std::vector<SingleFontData> LoadWidgetFontData(const std::string& name)
wchar_t wbuffer[256];
if (GetWindowsDirectoryW(wbuffer, 256))
{
returnv.resize(5);
FString windir(wbuffer);
returnv[3].fontdata = LoadDiskFile((windir + "/fonts/yugothm.ttc").GetChars());
returnv[3].language = "ja";

View file

@ -72,8 +72,8 @@ void LauncherWindow::Exit()
void LauncherWindow::UpdateLanguage()
{
// Pages->SetTabText(PlayGame, GStrings("PICKER_TAB_PLAY"));
// Pages->SetTabText(Settings, GStrings("PICKER_TAB_SETTINGS"));
Pages->SetTabText(PlayGame, GStrings("PICKER_TAB_PLAY"));
Pages->SetTabText(Settings, GStrings("OPTMNU_TITLE"));
Banner->UpdateLanguage();
PlayGame->UpdateLanguage();
Settings->UpdateLanguage();

View file

@ -183,6 +183,8 @@ void SettingsPage::OnGeometryChanged()
y += DontAskAgainCheckbox->GetPreferredHeight();
#ifdef RENDER_BACKENDS
double x = w / 2 - panelWidth / 2;
y = 0;
BackendLabel->SetFrameGeometry(x, y, 190.0, BackendLabel->GetPreferredHeight());
y += BackendLabel->GetPreferredHeight();
@ -192,7 +194,6 @@ void SettingsPage::OnGeometryChanged()
OpenGLCheckbox->SetFrameGeometry(x, y, 190.0, OpenGLCheckbox->GetPreferredHeight());
y += OpenGLCheckbox->GetPreferredHeight();
double x = w / 2 - panelWidth / 2;
GLESCheckbox->SetFrameGeometry(x, y, 190.0, GLESCheckbox->GetPreferredHeight());
y += GLESCheckbox->GetPreferredHeight();
#endif

View file

@ -719,18 +719,21 @@ struct ModelOverride
enum EModelDataFlags
{
MODELDATA_HADMODEL = 1 << 0,
MODELDATA_OVERRIDE_FLAGS = 1 << 1,
};
class DActorModelData : public DObject
{
DECLARE_CLASS(DActorModelData, DObject);
public:
FName modelDef;
PClass * modelDef;
TArray<ModelOverride> models;
TArray<FTextureID> skinIDs;
TArray<int> animationIDs;
TArray<int> modelFrameGenerators;
int flags;
int overrideFlagsSet;
int overrideFlagsClear;
AnimOverride curAnim;
AnimOverride prevAnim; // used for interpolation when switching anims

View file

@ -5096,7 +5096,7 @@ static void EnsureModelData(AActor * mobj)
auto ptr = Create<DActorModelData>();
ptr->flags = (mobj->hasmodel ? MODELDATA_HADMODEL : 0);
ptr->modelDef = NAME_None;
ptr->modelDef = nullptr;
mobj->modelData = ptr;
mobj->hasmodel = true;
@ -5111,7 +5111,8 @@ static void CleanupModelData(AActor * mobj)
&& mobj->modelData->modelFrameGenerators.Size() == 0
&& mobj->modelData->skinIDs.Size() == 0
&& mobj->modelData->animationIDs.Size() == 0
&& mobj->modelData->modelDef == NAME_None)
&& mobj->modelData->modelDef == nullptr
&&(mobj->modelData->flags & ~MODELDATA_HADMODEL) == 0 )
{
mobj->hasmodel = mobj->modelData->flags & MODELDATA_HADMODEL;
mobj->modelData->Destroy();
@ -5123,6 +5124,8 @@ enum ESetAnimationFlags
{
SAF_INSTANT = 1 << 0,
SAF_LOOP = 1 << 1,
SAF_USEACTORROLL = 1 << 2,
SAF_USEACTORPITCH = 1 << 3,
};
void SetAnimationInternal(AActor * self, FName animName, double framerate, int startFrame, int loopFrame, int interpolateTics, int flags, double ticFrac)
@ -5265,6 +5268,32 @@ void SetAnimationFrameRateUINative(AActor * self, double framerate)
SetAnimationFrameRateInternal(self, framerate, I_GetTimeFrac());
}
void SetModelFlag(AActor * self, int flag)
{
EnsureModelData(self);
self->modelData->flags |= MODELDATA_OVERRIDE_FLAGS;
self->modelData->overrideFlagsSet |= flag;
self->modelData->overrideFlagsClear &= ~flag;
}
void ClearModelFlag(AActor * self, int flag)
{
EnsureModelData(self);
self->modelData->flags |= MODELDATA_OVERRIDE_FLAGS;
self->modelData->overrideFlagsClear |= flag;
self->modelData->overrideFlagsSet &= ~flag;
}
void ResetModelFlags(AActor * self)
{
if(self->modelData)
{
self->modelData->overrideFlagsClear = 0;
self->modelData->overrideFlagsSet = 0;
self->modelData->flags &= ~MODELDATA_OVERRIDE_FLAGS;
}
}
enum ChangeModelFlags
{
CMDL_WEAPONTOPLAYER = 1 << 0,
@ -5291,14 +5320,16 @@ void ChangeModelNative(
) {
if(!self) ThrowAbortException(X_READ_NIL, "In function parameter self");
FName modeldef { ENamedName(i_modeldef) };
FName n_modeldef { ENamedName(i_modeldef) };
FName model { ENamedName(i_model) };
FName skin { ENamedName(i_skin) };
FName animation { ENamedName(i_animation) };
if (modeldef != NAME_None && PClass::FindClass(modeldef.GetChars()) == nullptr)
PClass * modeldef = nullptr;
if (n_modeldef != NAME_None && (modeldef = PClass::FindActor(n_modeldef.GetChars())) == nullptr)
{
Printf("Attempt to pass invalid modeldef name %s in %s.", modeldef.GetChars(), self->GetCharacterName());
Printf("Attempt to pass invalid modeldef name %s in %s.", n_modeldef.GetChars(), self->GetCharacterName());
return;
}
@ -5533,6 +5564,35 @@ DEFINE_ACTION_FUNCTION_NATIVE(AActor, SetAnimationFrameRateUI, SetAnimationFrame
return 0;
}
DEFINE_ACTION_FUNCTION_NATIVE(AActor, SetModelFlag, SetModelFlag)
{
PARAM_ACTION_PROLOGUE(AActor);
PARAM_INT(flag);
SetModelFlag(self, flag);
return 0;
}
DEFINE_ACTION_FUNCTION_NATIVE(AActor, ClearModelFlag, ClearModelFlag)
{
PARAM_ACTION_PROLOGUE(AActor);
PARAM_INT(flag);
ClearModelFlag(self, flag);
return 0;
}
DEFINE_ACTION_FUNCTION_NATIVE(AActor, ResetModelFlags, ResetModelFlags)
{
PARAM_ACTION_PROLOGUE(AActor);
ResetModelFlags(self);
return 0;
}
// This needs to account for the fact that internally renderstyles are stored as a series of operations,
// but the script side only cares about symbolic constants.
DEFINE_ACTION_FUNCTION(AActor, GetRenderStyle)

View file

@ -1823,7 +1823,7 @@ int P_LookForPlayers (AActor *actor, INTBOOL allaround, FLookExParams *params)
if (!(player->mo->flags & MF_SHOOTABLE))
continue; // not shootable (observer or dead)
if (actor->IsFriend(player->mo))
if (!actor->IsHostile(player->mo))
continue; // same +MF_FRIENDLY, ignore
if (player->cheats & CF_NOTARGET)
@ -1917,7 +1917,7 @@ DEFINE_ACTION_FUNCTION(AActor, A_Look)
targ = NULL;
}
if (targ && targ->player && ((targ->player->cheats & CF_NOTARGET) || !(targ->flags & MF_FRIENDLY)))
if (targ && targ->player && ((targ->player->cheats & CF_NOTARGET) || !self->IsHostile(targ)))
{
return 0;
}
@ -1931,7 +1931,7 @@ DEFINE_ACTION_FUNCTION(AActor, A_Look)
if (targ && (targ->flags & MF_SHOOTABLE))
{
if (self->IsFriend (targ)) // be a little more precise!
if (!self->IsHostile (targ)) // be a little more precise!
{
// If we find a valid target here, the wandering logic should *not*
// be activated! It would cause the seestate to be set twice.

View file

@ -1361,6 +1361,8 @@ void DActorModelData::Serialize(FSerializer& arc)
("animationIDs", animationIDs)
("modelFrameGenerators", modelFrameGenerators)
("flags", flags)
("overrideFlagsSet", overrideFlagsSet)
("overrideFlagsClear", overrideFlagsClear)
("curAnim", curAnim)
("prevAnim", prevAnim);
}

View file

@ -66,8 +66,10 @@ void RenderModel(FModelRenderer *renderer, float x, float y, float z, FSpriteMod
{
// Setup transformation.
int smf_flags = smf->getFlags(actor->modelData);
FTranslationID translation = NO_TRANSLATION;
if (!(smf->flags & MDL_IGNORETRANSLATION))
if (!(smf_flags & MDL_IGNORETRANSLATION))
translation = actor->Translation;
// y scale for a sprite means height, i.e. z in the world!
@ -85,7 +87,7 @@ void RenderModel(FModelRenderer *renderer, float x, float y, float z, FSpriteMod
float angle = angles.Yaw.Degrees();
// [BB] Workaround for the missing pitch information.
if ((smf->flags & MDL_PITCHFROMMOMENTUM))
if ((smf_flags & MDL_PITCHFROMMOMENTUM))
{
const double x = actor->Vel.X;
const double y = actor->Vel.Y;
@ -105,7 +107,7 @@ void RenderModel(FModelRenderer *renderer, float x, float y, float z, FSpriteMod
}
}
if (smf->flags & MDL_ROTATING)
if (smf_flags & MDL_ROTATING)
{
bool isPaused = paused || P_CheckTickerPaused();
float timeFloat;
@ -135,13 +137,13 @@ void RenderModel(FModelRenderer *renderer, float x, float y, float z, FSpriteMod
// Added MDL_USEACTORPITCH and MDL_USEACTORROLL flags processing.
// If both flags MDL_USEACTORPITCH and MDL_PITCHFROMMOMENTUM are set, the pitch sums up the actor pitch and the velocity vector pitch.
if (smf->flags & MDL_USEACTORPITCH)
if (smf_flags & MDL_USEACTORPITCH)
{
double d = angles.Pitch.Degrees();
if (smf->flags & MDL_BADROTATION) pitch += d;
if (smf_flags & MDL_BADROTATION) pitch += d;
else pitch -= d;
}
if (smf->flags & MDL_USEACTORROLL) roll += angles.Roll.Degrees();
if (smf_flags & MDL_USEACTORROLL) roll += angles.Roll.Degrees();
VSMatrix objectToWorldMatrix;
objectToWorldMatrix.loadIdentity();
@ -157,7 +159,7 @@ void RenderModel(FModelRenderer *renderer, float x, float y, float z, FSpriteMod
// [MK] distortions might happen depending on when the pixel stretch is compensated for
// so we make the "undistorted" behavior opt-in
if (smf->flags & MDL_CORRECTPIXELSTRETCH)
if (smf_flags & MDL_CORRECTPIXELSTRETCH)
{
stretch = (smf->modelIDs[0] != -1 ? Models[smf->modelIDs[0]]->getAspectFactor(actor->Level->info->pixelstretch) : 1.f) / actor->Level->info->pixelstretch;
objectToWorldMatrix.scale(1, stretch, 1);
@ -165,14 +167,14 @@ void RenderModel(FModelRenderer *renderer, float x, float y, float z, FSpriteMod
// Applying model transformations:
// 1) Applying actor angle, pitch and roll to the model
if (smf->flags & MDL_USEROTATIONCENTER)
if (smf_flags & MDL_USEROTATIONCENTER)
{
objectToWorldMatrix.translate(smf->rotationCenterX, smf->rotationCenterZ/stretch, smf->rotationCenterY);
}
objectToWorldMatrix.rotate(-angle, 0, 1, 0);
objectToWorldMatrix.rotate(pitch, 0, 0, 1);
objectToWorldMatrix.rotate(-roll, 1, 0, 0);
if (smf->flags & MDL_USEROTATIONCENTER)
if (smf_flags & MDL_USEROTATIONCENTER)
{
objectToWorldMatrix.translate(-smf->rotationCenterX, -smf->rotationCenterZ/stretch, -smf->rotationCenterY);
}
@ -180,7 +182,7 @@ void RenderModel(FModelRenderer *renderer, float x, float y, float z, FSpriteMod
// 2) Applying Doomsday like rotation of the weapon pickup models
// The rotation angle is based on the elapsed time.
if (smf->flags & MDL_ROTATING)
if (smf_flags & MDL_ROTATING)
{
objectToWorldMatrix.translate(smf->rotationCenterX, smf->rotationCenterY/stretch, smf->rotationCenterZ);
objectToWorldMatrix.rotate(rotateOffset, smf->xrotate, smf->yrotate, smf->zrotate);
@ -198,7 +200,7 @@ void RenderModel(FModelRenderer *renderer, float x, float y, float z, FSpriteMod
objectToWorldMatrix.rotate(smf->pitchoffset, 0, 0, 1);
objectToWorldMatrix.rotate(-smf->rolloffset, 1, 0, 0);
if (!(smf->flags & MDL_CORRECTPIXELSTRETCH))
if (!(smf_flags & MDL_CORRECTPIXELSTRETCH))
{
stretch = (smf->modelIDs[0] != -1 ? Models[smf->modelIDs[0]]->getAspectFactor(actor->Level->info->pixelstretch) : 1.f) / actor->Level->info->pixelstretch;
objectToWorldMatrix.scale(1, stretch, 1);
@ -206,15 +208,17 @@ void RenderModel(FModelRenderer *renderer, float x, float y, float z, FSpriteMod
float orientation = scaleFactorX * scaleFactorY * scaleFactorZ;
renderer->BeginDrawModel(actor->RenderStyle, smf, objectToWorldMatrix, orientation < 0);
renderer->BeginDrawModel(actor->RenderStyle, smf_flags, objectToWorldMatrix, orientation < 0);
RenderFrameModels(renderer, actor->Level, smf, actor->state, actor->tics, translation, actor);
renderer->EndDrawModel(actor->RenderStyle, smf);
renderer->EndDrawModel(actor->RenderStyle, smf_flags);
}
void RenderHUDModel(FModelRenderer *renderer, DPSprite *psp, FVector3 translation, FVector3 rotation, FVector3 rotation_pivot, FSpriteModelFrame *smf)
{
AActor * playermo = players[consoleplayer].camera;
int smf_flags = smf->getFlags(psp->Caller->modelData);
// [BB] No model found for this sprite, so we can't render anything.
if (smf == nullptr)
return;
@ -225,7 +229,7 @@ void RenderHUDModel(FModelRenderer *renderer, DPSprite *psp, FVector3 translatio
// [Nash] Optional scale weapon FOV
float fovscale = 1.0f;
if (smf->flags & MDL_SCALEWEAPONFOV)
if (smf_flags & MDL_SCALEWEAPONFOV)
{
fovscale = tan(players[consoleplayer].DesiredFOV * (0.5f * M_PI / 180.f));
fovscale = 1.f + (fovscale - 1.f) * cl_scaleweaponfov;
@ -262,12 +266,12 @@ void RenderHUDModel(FModelRenderer *renderer, DPSprite *psp, FVector3 translatio
float orientation = smf->xscale * smf->yscale * smf->zscale;
renderer->BeginDrawHUDModel(playermo->RenderStyle, objectToWorldMatrix, orientation < 0, smf);
renderer->BeginDrawHUDModel(playermo->RenderStyle, objectToWorldMatrix, orientation < 0, smf_flags);
auto trans = psp->GetTranslation();
if ((psp->Flags & PSPF_PLAYERTRANSLATED)) trans = psp->Owner->mo->Translation;
RenderFrameModels(renderer, playermo->Level, smf, psp->GetState(), psp->GetTics(), trans, psp->Caller);
renderer->EndDrawHUDModel(playermo->RenderStyle, smf);
renderer->EndDrawHUDModel(playermo->RenderStyle, smf_flags);
}
double getCurrentFrame(const AnimOverride &anim, double tic)
@ -312,6 +316,9 @@ void RenderFrameModels(FModelRenderer *renderer, FLevelLocals *Level, const FSpr
{
// [BB] Frame interpolation: Find the FSpriteModelFrame smfNext which follows after smf in the animation
// and the scalar value inter ( element of [0,1) ), both necessary to determine the interpolated frame.
int smf_flags = smf->getFlags(actor->modelData);
const FSpriteModelFrame * smfNext = nullptr;
double inter = 0.;
double inter_main = -1.f;
@ -351,7 +358,7 @@ void RenderFrameModels(FModelRenderer *renderer, FLevelLocals *Level, const FSpr
}
}
}
else if (gl_interpolate_model_frames && !(smf->flags & MDL_NOINTERPOLATION))
else if (gl_interpolate_model_frames && !(smf_flags & MDL_NOINTERPOLATION))
{
FState *nextState = curState->GetNextState();
if (curState != nextState && nextState)
@ -373,7 +380,7 @@ void RenderFrameModels(FModelRenderer *renderer, FLevelLocals *Level, const FSpr
{
// [BB] Workaround for actors that use the same frame twice in a row.
// Most of the standard Doom monsters do this in their see state.
if ((smf->flags & MDL_INTERPOLATEDOUBLEDFRAMES))
if ((smf_flags & MDL_INTERPOLATEDOUBLEDFRAMES))
{
const FState *prevState = curState - 1;
if ((curState->sprite == prevState->sprite) && (curState->Frame == prevState->Frame))
@ -539,7 +546,7 @@ void RenderFrameModels(FModelRenderer *renderer, FLevelLocals *Level, const FSpr
}
// [RL0] while per-model animations aren't done, DECOUPLEDANIMATIONS does the same as MODELSAREATTACHMENTS
if ((!(smf->flags & MDL_MODELSAREATTACHMENTS) && !is_decoupled) || !evaluatedSingle)
if ((!(smf_flags & MDL_MODELSAREATTACHMENTS) && !is_decoupled) || !evaluatedSingle)
{
if (animationid >= 0)
{
@ -593,7 +600,7 @@ static TArray<int> SpriteModelHash;
//
//===========================================================================
static void ParseModelDefLump(int Lump);
void ParseModelDefLump(int Lump);
void InitModels()
{
@ -675,7 +682,7 @@ void InitModels()
}
}
static void ParseModelDefLump(int Lump)
void ParseModelDefLump(int Lump)
{
FScanner sc(Lump);
while (sc.GetString())
@ -1134,11 +1141,11 @@ FSpriteModelFrame * FindModelFrame(const AActor * thing, int sprite, int frame,
if(thing->flags9 & MF9_DECOUPLEDANIMATIONS)
{
return &BaseSpriteModelFrames[thing->GetClass()];
return &BaseSpriteModelFrames[(thing->modelData != nullptr && thing->modelData->modelDef != nullptr) ? thing->modelData->modelDef : thing->GetClass()];
}
else
{
return FindModelFrameRaw((thing->modelData != nullptr && thing->modelData->modelDef != NAME_None) ? PClass::FindActor(thing->modelData->modelDef) : thing->GetClass(), sprite, frame, dropped);
return FindModelFrameRaw((thing->modelData != nullptr && thing->modelData->modelDef != nullptr) ? thing->modelData->modelDef : thing->GetClass(), sprite, frame, dropped);
}
}
@ -1160,3 +1167,9 @@ bool IsHUDModelForPlayerAvailable (player_t * player)
}
return false;
}
unsigned int FSpriteModelFrame::getFlags(class DActorModelData * defs) const
{
return (defs && defs->flags & MODELDATA_OVERRIDE_FLAGS)? (flags | defs->overrideFlagsSet) & ~(defs->overrideFlagsClear) : flags;
}

View file

@ -54,7 +54,7 @@ VSMatrix FHWModelRenderer::GetViewToWorldMatrix()
return objectToWorldMatrix;
}
void FHWModelRenderer::BeginDrawModel(FRenderStyle style, FSpriteModelFrame *smf, const VSMatrix &objectToWorldMatrix, bool mirrored)
void FHWModelRenderer::BeginDrawModel(FRenderStyle style, int smf_flags, const VSMatrix &objectToWorldMatrix, bool mirrored)
{
state.SetDepthFunc(DF_LEqual);
state.EnableTexture(true);
@ -69,7 +69,7 @@ void FHWModelRenderer::BeginDrawModel(FRenderStyle style, FSpriteModelFrame *smf
// 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 ((smf->flags & MDL_FORCECULLBACKFACES) || (!(style == DefaultRenderStyle()) && !(smf->flags & MDL_DONTCULLBACKFACES)))
if ((smf_flags & MDL_FORCECULLBACKFACES) || (!(style == DefaultRenderStyle()) && !(smf_flags & MDL_DONTCULLBACKFACES)))
{
state.SetCulling((mirrored ^ di->drawctx->portalState.isMirrored()) ? Cull_CCW : Cull_CW);
}
@ -79,16 +79,16 @@ void FHWModelRenderer::BeginDrawModel(FRenderStyle style, FSpriteModelFrame *smf
state.SetModelMatrix(objectToWorldMatrix, normalModelMatrix);
}
void FHWModelRenderer::EndDrawModel(FRenderStyle style, FSpriteModelFrame *smf)
void FHWModelRenderer::EndDrawModel(FRenderStyle style, int smf_flags)
{
state.SetBoneIndexBase(-1);
state.SetModelMatrix(VSMatrix::identity(), VSMatrix::identity());
state.SetDepthFunc(DF_Less);
if ((smf->flags & MDL_FORCECULLBACKFACES) || (!(style == DefaultRenderStyle()) && !(smf->flags & MDL_DONTCULLBACKFACES)))
if ((smf_flags & MDL_FORCECULLBACKFACES) || (!(style == DefaultRenderStyle()) && !(smf_flags & MDL_DONTCULLBACKFACES)))
state.SetCulling(Cull_None);
}
void FHWModelRenderer::BeginDrawHUDModel(FRenderStyle style, const VSMatrix &objectToWorldMatrix, bool mirrored, FSpriteModelFrame *smf)
void FHWModelRenderer::BeginDrawHUDModel(FRenderStyle style, const VSMatrix &objectToWorldMatrix, bool mirrored, int smf_flags)
{
state.SetDepthFunc(DF_LEqual);
state.SetDepthClamp(true);
@ -104,7 +104,7 @@ void FHWModelRenderer::BeginDrawHUDModel(FRenderStyle style, const VSMatrix &obj
// [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.
// TO-DO: Implement proper depth sorting.
if (!(style == DefaultRenderStyle()) || (smf->flags & MDL_FORCECULLBACKFACES))
if (!(style == DefaultRenderStyle()) || (smf_flags & MDL_FORCECULLBACKFACES))
{
state.SetCulling((mirrored ^ di->drawctx->portalState.isMirrored()) ? Cull_CW : Cull_CCW);
}
@ -114,13 +114,13 @@ void FHWModelRenderer::BeginDrawHUDModel(FRenderStyle style, const VSMatrix &obj
state.SetModelMatrix(objectToWorldMatrix, normalModelMatrix);
}
void FHWModelRenderer::EndDrawHUDModel(FRenderStyle style, FSpriteModelFrame *smf)
void FHWModelRenderer::EndDrawHUDModel(FRenderStyle style, int smf_flags)
{
state.SetBoneIndexBase(-1);
state.SetModelMatrix(VSMatrix::identity(), VSMatrix::identity());
state.SetDepthFunc(DF_Less);
if (!(style == DefaultRenderStyle()) || (smf->flags & MDL_FORCECULLBACKFACES))
if (!(style == DefaultRenderStyle()) || (smf_flags & MDL_FORCECULLBACKFACES))
state.SetCulling(Cull_None);
}

View file

@ -46,12 +46,12 @@ public:
FHWModelRenderer(HWDrawInfo *d, FRenderState &st, int mli) : modellightindex(mli), di(d), state(st)
{}
ModelRendererType GetType() const override { return GLModelRendererType; }
void BeginDrawModel(FRenderStyle style, FSpriteModelFrame *smf, const VSMatrix &objectToWorldMatrix, bool mirrored) override;
void EndDrawModel(FRenderStyle style, FSpriteModelFrame *smf) override;
void BeginDrawModel(FRenderStyle style, int smf_flags, const VSMatrix &objectToWorldMatrix, bool mirrored) override;
void EndDrawModel(FRenderStyle style, int smf_flags) override;
IModelVertexBuffer *CreateVertexBuffer(bool needindex, bool singleframe) override;
VSMatrix GetViewToWorldMatrix() override;
void BeginDrawHUDModel(FRenderStyle style, const VSMatrix &objectToWorldMatrix, bool mirrored, FSpriteModelFrame *smf) override;
void EndDrawHUDModel(FRenderStyle style, FSpriteModelFrame *smf) override;
void BeginDrawHUDModel(FRenderStyle style, const VSMatrix &objectToWorldMatrix, bool mirrored, int smf_flags) override;
void EndDrawHUDModel(FRenderStyle style, int smf_flags) override;
void SetInterpolation(double interpolation) override;
void SetMaterial(FGameTexture *skin, bool clampNoFilter, FTranslationID translation) override;
void DrawArrays(int start, int count) override;

View file

@ -383,6 +383,7 @@ public:
PalEntry ThingColor; // thing's own color
FColormap Colormap;
FSpriteModelFrame * modelframe;
int modelframeflags;
FRenderStyle RenderStyle;
int OverrideShader;

View file

@ -478,7 +478,7 @@ bool HWSprite::CalculateVertices(HWDrawInfo *di, FVector3 *v, DVector3 *vp)
FQuaternion quat = FQuaternion::FromAngles(FAngle::fromDeg(270) - di->Viewpoint.HWAngles.Yaw, di->Viewpoint.HWAngles.Pitch, FAngle::fromDeg(0));
FVector3 sideVec = quat * FVector3(0, 1, 0);
FVector3 upVec = quat * FVector3(0, 0, 1);
FVector3 res = sideVec * -offx + upVec * offy;
FVector3 res = sideVec * -offx + upVec * -offy;
mat.Translate(res.X, res.Z, res.Y);
}
@ -558,7 +558,7 @@ bool HWSprite::CalculateVertices(HWDrawInfo *di, FVector3 *v, DVector3 *vp)
inline void HWSprite::PutSprite(HWDrawInfo *di, FRenderState& state, bool translucent)
{
// That's a lot of checks...
if (modelframe && !modelframe->isVoxel && !(modelframe->flags & MDL_NOPERPIXELLIGHTING) && RenderStyle.BlendOp != STYLEOP_Shadow && gl_light_sprites && di->Level->HasDynamicLights && !di->isFullbrightScene() && !fullbright)
if (modelframe && !modelframe->isVoxel && !(modelframeflags & MDL_NOPERPIXELLIGHTING) && RenderStyle.BlendOp != STYLEOP_Shadow && gl_light_sprites && di->Level->HasDynamicLights && !di->isFullbrightScene() && !fullbright)
{
hw_GetDynModelLight(di->drawctx, actor, lightdata);
dynlightindex = state.UploadLights(lightdata);
@ -855,6 +855,7 @@ void HWSprite::Process(HWDrawInfo *di, FRenderState& state, AActor* thing, secto
}
modelframe = isPicnumOverride ? nullptr : FindModelFrame(thing, spritenum, thing->frame, !!(thing->flags & MF_DROPPED));
modelframeflags = modelframe ? modelframe->getFlags(thing->modelData) : 0;
// Too close to the camera. This doesn't look good if it is a sprite.
if (fabs(thingpos.X - vp.Pos.X) < 2 && fabs(thingpos.Y - vp.Pos.Y) < 2

View file

@ -843,7 +843,7 @@ Simple options menu,OPTMNU_SIMPLEON,,,,Zjednodušená nastavení,Enkel menu med
Browse Game Config,OPTMNU_OPENCONFIG,,,,Procházet konfigurační soubory,Gennemse spilkonfiguration,Konfigurationsdatei anzeigen,,Foliumi agordojn de ludo,Abrir carpeta de configuración de juego,,Selaa pelin asetuksia,Parcourir configuration,Játék konfiguráció böngészése,Apri le Configurazioni di Gioco,ゲームコンフィグ参照,게임 환경설정 찾아보기,Door gameconfiguratie bladeren,Bla gjennom spillkonfigurasjon,Przeglądaj Ustawienia Gry,Abrir pasta de configuração de jogo,,Caută Configurația Jocului,Открыть файл настроек игры,,Bläddra i spelkonfigurationen,Oyun Yapılandırmasına Gözat,Перегляд налаштувань гри,
Browse Screenshots,OPTMNU_OPENSCREENSHOTS,,,,Procházet snímky obrazovky,Gennemse skærmbilleder,Screenshots anzeigen,,Foliumi ekrankopiojn,Abrir carpeta de capturas de pantalla,,Selaa kuvakaappauksia,Parcourir les captures d'écran,Képernyőképek böngészése,Apri gli Screenshot,クリーンショット参照,스크린샷 찾아보기,Door schermafbeeldingen bladeren,Bla gjennom skjermbilder,Przeglądaj Zrzuty Ekranu,Abrir pasta de capturas de tela,,Caută Capturi de Ecran,Просмотр снимков экрана,,Bläddra bland skärmdumpar,Ekran Görüntülerine Gözat,Перегляд скріншотів,
Browse Saved Games,OPTMNU_OPENSAVES,,,,Procházet uložené hry,Gennemse gemte spil,Spielstände anzeigen,,Foliumi konservitajn ludadojn,Abrir carpeta de partidas guardadas,,Selaa tallennettuja pelejä,Parcourir sauvegardes,Elmentett játékok böngészése,Apri i Giochi Salvati,セーブしたゲーム参照,저장된 게임 찾아보기,Door opgeslagen games bladeren,Bla gjennom lagrede spill,Przeglądaj Zapisy Gry,Abrir pasta de jogos salvos,,Caută Salvări,Просмотр сохранённых игр,,Bläddra bland sparade spel,Kaydedilen Oyunlara Gözat,Перегляд збережень ігр,
Swap mouse buttons,MOUSEMNU_SWAPBUTTONS,,,,Prohodit tlačítka myši,Udskift museknapper,Maustasten vertauschen,,Permuti musbutonojn,Alternar botones de ratón,,Vaihda hiiren painikkeita,Permuter les boutons de la souris,Egérgombok felcserélése,Inverti i comandi del mouse,マウスボタンを反転,마우스 버튼 바꾸기,Muisknoppen verwisselen,Bytt museknapper,Zamień Przyciski Myszki,Trocar botões do mouse,,Schimbă Butoanele Mouse-ului între Ele,Поменять местами кнопки мыши,,Byta musknappar,Fare düğmelerini değiştirme,Поміняти місцями кнопки миші,
Swap mouse buttons,MOUSEMNU_SWAPBUTTONS,,,,Prohodit tlačítka myši,Udskift museknapper,Maustasten vertauschen,,Permuti musbutonojn,Alternar botones de ratón,,Vaihda hiiren painikkeita,Permuter les boutons de la souris,Egérgombok felcserélése,Inverti i comandi del mouse,マウスボタンを反転,마우스 버튼 바꾸기,Muisknoppen verwisselen,Bytt museknapper,Zamień Przyciski Myszki,Trocar botões do mouse,,Schimbă Butoanele Mouse-ului între Ele,Поменять местами кнопки мыши,Замените дугмад миша,Byta musknappar,Fare düğmelerini değiştirme,Поміняти місцями кнопки миші,
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
Only modified,OPTVAL_ONLYMODIFIED,,,,Pouze upravené,Kun ændret,Nur modfizierte,,Nur modifitaj,Solo modificados,,Vain muunneltu,Modifié seulement,Csak módosított,Solo modificato,モディファイのみ,수정된 것만,Alleen gewijzigd,Bare endret,Tylko zmodyfikowane,Somente modificado,,Numai modificat,Только изменённый,Само модификовано,Endast ändrat,Yalnızca değiştirilmiş,Тільки в модифікаціях,
Unknown,TXT_UNKNOWN,,,,Neznámé,Ukendt,Unbekannt,Άχνωστο,Nekonata,Desconocido,,Tuntematon,Inconnue,Ismeretlen,Sconosciuto,不明,알 수 없음,Onbekend,Ukjent,Nieznane,Desconhecido,,Necunoscut,Неизвестно,Непознат,Okänd,Bilinmiyor,Невідомо,
@ -851,26 +851,27 @@ HUD,OPTVAL_HUD,,,,,,,,,,,,ATH,,,,,,,,,,,Отображение информац
Automap,OPTVAL_AUTOMAP,,,,Automapa,,,,Aŭtomata mapo,Automapa,,,Carte,Auto-térkép,Automappa,オートマップ,오토맵,,,Automapa,Automapa,,Hartă Computerizată,Автокарта,Аутомап,,,Автокарта,
HUD + Automap,OPTVAL_HUDANDMAP,,,,HUD + Automapa,,,,HUD + Aŭtomata mapo,HUD + Automapa,,,ATH + Carte,HUD + Auto-térkép,HUD + Automappa,HUD+オートマップ,HUD + 오토맵,,,HUD + Automapa,HUD + Automapa,,Interfață + Hartă Computerizată,Интерфейс + автокарта,HUD + Аутомап,,,Інтерфейс + Автокарта,
This savegame needs these files,TXT_SAVEGAMENEEDS,,,,Uložená hra potřebuje tyto soubory,Dette savegame har brug for disse filer,Dieser Spielstand benötigt die folgenden Dateien,Το αρχείο αποθήκευσης χριάζετε αυτά τα αρχεία,Ĉi tiu konservita ludo bezonas ĉi tiujn dosierojn,Esta partida guardada necesita los siguientes archivos,,Tämä pelitallenne tarvitsee nämä tiedostot,Cette sauvegarde nécessite les fichiers suivants:,Ehhez a mentéshez a következő fájlok kellenek:,Questo salvataggio ha bisogno di questi file,このセーブデータには 必要なファイルがある,이 저장 된 게임은 해당 파일이 필요합니다.,Dit spel heeft de volgende bestanden nodig,Dette lagringsspillet trenger disse filene,Ten zapis gry potrzebuje tych plików,Este jogo salvo precisa destes arquivos,Este jogo guardado precisa destes arquivos,Acest joc salvat necesită următoarele fișiere,Данное сохранение требует следующие файлы,Овој сачуваној игри требају ови фајлови,Detta sparande behöver dessa filer,Bu kayıt oyunu şu dosyalara ihtiyaç duyar,Цій грі потрібні такі файли,
Multiplayer Options,OPTMNU_MULTIPLAYER,,,,Multiplayer,Multiplayer-indstillinger,Mehrspieleroptionen,,Agordoj de la plurludanta reĝimo,Opciones del multijugador,,,,,,マルチプレイ オプション,,Multiplayer Opties,Alternativer for flerspiller,Opcje Trybu Wielu Graczy,Opções de multijogador,,,Настройки сетевой игры,,Alternativ för flera spelare,Çok Oyunculu Seçenekler,Параметри багатокористувацької гри,
Input Options,OPTMNU_INPUT,,,,Vstupní zařízení,Input-indstillinger,Eingabeoptionen,,Enig-agordoj,Opciones de entrada (input),,,,,,入力オプション,,In1voeropties,Alternativer for inndata,Opcje Sterowania,Opções de entrada,,,Настройки ввода,,Inmatningsalternativ,Girdi Seçenekleri,Параметри введення,
System Options,OPTMNU_SYSTEM,,,,Systém,Systemindstillinger,Systemoptionen,,Agordoj de la sistemo,Opciones del sistema,,,,,,システムオプション,,Systeem Opties,Systemalternativer,Opcje Systemowe,Opções de sistema,,,Настройки системы,,Systemalternativ,Sistem Seçenekleri,Системні налаштування,
Light Options,OPTMNU_LIGHT,,,,Osvětlení,Lysindstillinger,Beleuchtungsoptionen,,Lum-agordoj,Opciones de iluminación,,,,,,光源オプション,,Licht Opties,Alternativer for lys,Opcje Oświetlenia,Opções de iluminação,,,Настройки освещения,,Alternativ för ljus,Işık Seçenekleri,Параметри освітлення,
Sprite Options,OPTMNU_SPRITE,,,,Sprity,Sprite-indstillinger,Spriteoptionen,,Agordoj de la mov-rastrumoj,Opciones de los «sprites»,,,,,,スプライトオプション,,Sprite-opties,Sprite-alternativer,Opcje Sprite'ów,Opções de sprite,,,Настройки спрайтов,,Alternativ för sprite,Sprite Seçenekleri,Параметри спрайтів,
Coronas,GLPREFMNU_CORONAS,,,,Záře,Coronas,,,Lum-ampoloj,Focos de luz,,,,,,光冠,,Corona's,Koronaer,Korony,,,,Короны,,Koronor,Koronalar,Корони,
Appearance,DSPLYMNU_APPEARANCE,,,,Vzhled,Udseende,Spieldarstellung,,Aspekto,Apariencia,,,,,,アピアランス,,Uiterlijk,Utseende,Wygląd,Aparência,,,Внешность,,Utseende,Görünüş,Зовнішній вигляд,
Advanced Display Options,DSPLYMNU_ADVANCED,,,,Grafika (pokročilé),Avancerede visningsindstillinger,Erweiterte Anzeigeoptionen,,Altnivelaj ekran-agordoj,Opciones avanzadas de visualización,,,,,,高度なディスプレイオプション,,Geavanceerde Weergave Opties,Avanserte visningsalternativer,Zaawansowane Opcje Wyświetlania,Opções de vídeo avançadas,,,Расширенные настройки экрана,,Avancerade visningsalternativ,Gelişmiş Görüntüleme Seçenekleri,Додаткові параметри відображення,
Select which game file to run.,PICKER_SELECT,,,,,,Bitte wähle ein Spiel aus.,,,,,,,,,,,,,,,,,Выбор файла игры для запуска.,,,,,
Play Game,PICKER_PLAY,,,,,,Spielen,,,,,,,,,,,,,,,,,Играть,,,,,
Exit,PICKER_EXIT,,,,,,Verlassen,,,,,,,,,,,,,,,,,Выход,,,,,
General,PICKER_GENERAL,,,,,,Allgemein,,,,,,,,,,,,,,,,,Общее,,,,,
Extra Graphics,PICKER_EXTRA,,,,,,Extragrafiken,,,,,,,,,,,,,,,,,Доп. графика,,,,,
Fullscreen,PICKER_FULLSCREEN,,,,,,Vollbild,,,,,,,,,,,,,,,,,Полный экран,,,,,
Disable autoload,PICKER_NOAUTOLOAD,,,,,,Autoload deaktivieren,,,,,,,,,,,,,,,,,Отключить автозагрузку,,,,,
Don't ask me again,PICKER_DONTASK,,,,,,Nicht nochmal fragen,,,,,,,,,,,,,,,,,Не спрашивать снова,,,,,
Lights,PICKER_LIGHTS,,,,,,Lichter,,,,,,,,,,,,,,,,,Освещение,,,,,
Brightmaps,PICKER_BRIGHTMAPS,,,,,,,,,,,,,,,,,,,,,,,Карты освещения,,,,,
Widescreen,PICKER_WIDESCREEN,,,,,,Breitbildunterstützung,,,,,,,,,,,,,,,,,Широкий экран,,,,,
Additional Parameters:,PICKER_ADDPARM,,,,,,Zusätzliche Parameter,,,,,,,,,,,,,,,,,Доп. параметры:,,,,,
Welcome to %s!,PICKER_WELCOME,,,,,,Willkommen bei %s!,,,,,,,,,,,,,,,,,Добро пожаловать в %s!,,,,,
Version %s,PICKER_VERSION,,,,,,,,,,,,,,,,,,,,,,,Версия %s,,,,,
Rendering API,PICKER_PREFERBACKEND,,,,API vykreslování,,Render API,,Preferita bildigado de API,API de renderizado,,Renderöinti API,API de rendu,Renderelő API,API di rendering,優先レンダリングAPI,기본적인 API 랜더링,,,API renderowania,API de renderização,,API Video Preferat,API для рендеринга,АПИ приказивања,API för rendering,,API для візуалізації,
Multiplayer Options,OPTMNU_MULTIPLAYER,,,,Multiplayer,Multiplayer-indstillinger,Mehrspieleroptionen,,Agordoj de la plurludanta reĝimo,Opciones del multijugador,,,Options multijoueurs,,,マルチプレイ オプション,,Multiplayer Opties,Alternativer for flerspiller,Opcje Trybu Wielu Graczy,Opções de multijogador,,,Настройки сетевой игры,Опције за више играча,Alternativ för flera spelare,Çok Oyunculu Seçenekler,Параметри багатокористувацької гри,
Input Options,OPTMNU_INPUT,,,,Vstupní zařízení,Input-indstillinger,Eingabeoptionen,,Enig-agordoj,Opciones de entrada (input),,,Options d'entrée,,,入力オプション,,In1voeropties,Alternativer for inndata,Opcje Sterowania,Opções de entrada,,,Настройки ввода,Опције уноса,Inmatningsalternativ,Girdi Seçenekleri,Параметри введення,
System Options,OPTMNU_SYSTEM,,,,Systém,Systemindstillinger,Systemoptionen,,Agordoj de la sistemo,Opciones del sistema,,,Options du système,,,システムオプション,,Systeem Opties,Systemalternativer,Opcje Systemowe,Opções de sistema,,,Настройки системы,Системске опције,Systemalternativ,Sistem Seçenekleri,Системні налаштування,
Light Options,OPTMNU_LIGHT,,,,Osvětlení,Lysindstillinger,Beleuchtungsoptionen,,Lum-agordoj,Opciones de iluminación,,,Options de lumière,,,光源オプション,,Licht Opties,Alternativer for lys,Opcje Oświetlenia,Opções de iluminação,,,Настройки освещения,Опције осветљења,Alternativ för ljus,Işık Seçenekleri,Параметри освітлення,
Sprite Options,OPTMNU_SPRITE,,,,Sprity,Sprite-indstillinger,Spriteoptionen,,Agordoj de la mov-rastrumoj,Opciones de los «sprites»,,,Options des sprites,,,スプライトオプション,,Sprite-opties,Sprite-alternativer,Opcje Sprite'ów,Opções de sprite,,,Настройки спрайтов,Сприте опције,Alternativ för sprite,Sprite Seçenekleri,Параметри спрайтів,
Coronas,GLPREFMNU_CORONAS,,,,Záře,Coronas,,,Lum-ampoloj,Focos de luz,,,Corons,,,光冠,,Corona's,Koronaer,Korony,,,,Короны,Цоронас,Koronor,Koronalar,Корони,
Appearance,DSPLYMNU_APPEARANCE,,,,Vzhled,Udseende,Spieldarstellung,,Aspekto,Apariencia,,,Apparence,,,アピアランス,,Uiterlijk,Utseende,Wygląd,Aparência,,,Внешность,Изглед,Utseende,Görünüş,Зовнішній вигляд,
Advanced Display Options,DSPLYMNU_ADVANCED,,,,Grafika (pokročilé),Avancerede visningsindstillinger,Erweiterte Anzeigeoptionen,,Altnivelaj ekran-agordoj,Opciones avanzadas de visualización,,,Options d'affichage avancées,,,高度なディスプレイオプション,,Geavanceerde Weergave Opties,Avanserte visningsalternativer,Zaawansowane Opcje Wyświetlania,Opções de vídeo avançadas,,,Расширенные настройки экрана,Напредне опције приказа,Avancerade visningsalternativ,Gelişmiş Görüntüleme Seçenekleri,Додаткові параметри відображення,
Select which game file to run.,PICKER_SELECT,,,,,"Vælg, hvilket spil du vil spille",Bitte wähle ein Spiel aus.,,,,,,Sélectionner le jeu à jouer,,,,,Selecteer welk spel je wilt spelen,Velg hvilket spill du vil spille,,Selecione o arquivo de jogo para rodar.,,,Выбор файла игры для запуска.,Изаберите коју датотеку игре желите да покренете.,Välj vilket spel du vill spela,Hangi oyunu oynayacağınızı seçin,,
Play Game,PICKER_PLAY,,,,,Start spil,Spielen,,,,,,Démarrer le jeu,,,,,Spel starten,Start spill,,Jogar,,,Играть,Играј игру,Starta spel,Oyunu Başlat,,
Exit,PICKER_EXIT,,,,,Afslut,Verlassen,,,,,,Quitter,,,,,Verlaten,Avslutt,,Sair,,,Выход,Изађи,Avsluta,Çıkış,,
General,PICKER_GENERAL,,,,,Generelt,Allgemein,,,,,,Général,,,,,Algemeen,Generelt,,Geral,,,Общее,Генерал,Allmänt,Genel,,
Extra Graphics,PICKER_EXTRA,,,,,Ekstra grafik,Extragrafiken,,,,,,Graphiques supplémentaires,,,,,Extra afbeeldingen,Ekstra grafikk,,Gráficos extra,,,Доп. графика,Ектра Грапхицс,Extra grafik,Ekstra Grafikler,,
Fullscreen,PICKER_FULLSCREEN,,,,,Fuld skærm,Vollbild,,,,,,Plein écran,,,,,Volledig scherm,Fullskjerm,,Tela cheia,,,Полный экран,Цео екран,Fullskärm,Tam Ekran,,
Disable autoload,PICKER_NOAUTOLOAD,,,,,Deaktiver autoload,Autoload deaktivieren,,,,,,Désactiver le chargement automatique,,,,,Autoload uitschakelen,Deaktiver autolading,,Desativar autocarregamento,,,Отключить автозагрузку,Онемогући аутоматско учитавање,Inaktivera autoload,Otomatik yükleme yok,,
Don't ask me again,PICKER_DONTASK,,,,,Spørg mig ikke igen,Nicht nochmal fragen,,,,,,Ne me demandez plus rien,,,,,Vraag me niet opnieuw,Ikke spør meg igjen,,Não me pergunte de novo,,,Не спрашивать снова,Не питај ме поново,Fråga mig inte igen,Bir daha sorma.,,
Lights,PICKER_LIGHTS,,,,,Lys,Lichtdefinitionen,,,,,,Lumières,,,,,Verlichting,Lysdefinisjoner,,Luzes,,,Освещение,Светла,Definitioner av ljus,Işık tanımları,,
Brightmaps,PICKER_BRIGHTMAPS,,,,,,,,,,,,Cartes lumineuses,,,,,Heldermaps,Lyskart,,,,,Карты освещения,Бригхтмапс,Ljuskartor,Brightmaps,,
Widescreen,PICKER_WIDESCREEN,,,,,,Breitbildunterstützung,,,,,,Écran large,,,,,Breedbeeld,Bredskjerm,,,,,Широкий экран,Широки екран,Bredbildsskärm,Geniş Ekran,,
Additional Parameters:,PICKER_ADDPARM,,,,,Yderligere parametre:,Zusätzliche Parameter,,,,,,Paramètres supplémentaires :,,,,,Extra parameters:,Ytterligere parametere:,,Parâmetros adicionais:,,,Доп. параметры:,Додатни параметри:,Ytterligare parametrar:,Ek Parametreler:,,
Welcome to %s!,PICKER_WELCOME,,,,,Velkommen til %s!,Willkommen bei %s!,,,,,,Bienvenue à %s !,,,,,Welkom bij %s!,Velkommen til %s!,,Boas vindas ao %s!,,,Добро пожаловать в %s!,Добродошли у %s!,Välkommen till %s!,S'ye hoş geldiniz!,,
Version %s,PICKER_VERSION,,,,,,,,,,,,,,,,,Versie %s,Versjon %s,,Versão %s,,,Версия %s,Верзија %s,,Sürüm %s,,
Rendering API,PICKER_PREFERBACKEND,,,,API vykreslování,,Render API,,Preferita bildigado de API,API de renderizado,,Renderöinti API,API de rendu,Renderelő API,API di rendering,優先レンダリングAPI,기본적인 API 랜더링,,,API renderowania,API de renderização,,API Video Preferat,API для рендеринга,АПИ приказивања,API för rendering,,API для візуалізації,
Game,PICKER_TAB_PLAY,,,,Hra,Spil,Spiel,,Ludo,Juego,,Peli,Jeu,Játék,Gioco,ゲーム,게임,Spel,Spill,Gra,Jogo,,Joc,Игра,Игра,Spel,Oyun,Гра,

View file

@ -1856,7 +1856,7 @@ zorcher.",Получена батарея фазерного зорчера.,П
Picked up a large zorcher recharge.,GOTLARGEZORCHERRECHARGE,,,,Sebrán náboj pro velký bzukr.,Afhentede en stor zorcher-opladning.,Du hast eine Zorcher-Ladung genommen.,,Prenis grandzorĉilo-reŝargon.,Recogiste una gran recarga de zorch.,,Poimit ison zorcherin latauksen,Vous avez pris une recharge pour zorcheur large.,Felvettél egy Nagy Zorker Újratöltőt,Raccolta una ricarica per zorcher grande.,ラージ ゾーチャーリチャージ をひろった。,대형 저치 카트리지 획득.,Je hebt een zorcherlading opgepakt.,Plukket opp en stor zorcher-opplading.,Zebrano ładunek do dużego zorchera.,Pegou recarga para zorcher grande.,Apanhaste recarga para o zorcher grande.,Ai ridicat o încărcătură mare pentru zorcher.,Получена зарядка большого зорчера.,Покупио си велики зорчер пуњач.,Plockade upp en stor zorcher-uppladdning.,Büyük bir zorcher şarjı aldım.,Взято заряд великого Зорчера.
Picked up a large zorcher pack.,GOTLARGEZORCHERPACK,,,,Sebrán balík pro velký bzukr.,Afhentede en stor zorcher-pakke.,Du hast ein Zorcher-Ladepaket genommen.,,Prenis grandegzorĉilo-reŝargon.,Recogiste un gran paquete de zorch.,,Poimit ison zorcherin paketin.,Vous avez pris un pack de recharges pour zorcheur large.,Felvettél egy Nagy Zorker Csomagot,Raccolta una scatola per zorcher grande.,ラージ ゾーチャーパック をひろった。,저치 카트리지 묶음 획득.,Je hebt een pakket met zorcherladingen opgepakt.,Plukket opp en stor zorcherpakke.,Zebrano paczkę dużego zorchera.,Pegou um pacote de recargas para zorcher grande.,Apanhaste um pacote de recargas para o zocher grande.,Ai ridicat un pachet mare de încărcături pentru zorcher.,Получена батарея большого зорчера.,Покупио си велики зорчер пакет.,Plockade upp ett stort zorcherpaket.,Büyük bir zorcher paketi aldı.,Взято батарею великого Зорчера.
Picked up a Zorchpak!,GOTZORCHPACK,,,,Sebrán Bzukrbatoh!,Afhentede en Zorchpak!,Du hast ein Zorchpaket genommen.,,Prenis Zorĉpakon!,¡Recogiste un Zorchpak!,,Poimit zorchpakin!,Vous avez pris un zorchpak!,Felvettél egy Zorkpakkot!,Raccolto uno ZorchZaino!,ゾーチパックをてにいれた!,저치 팩 획득!,Je hebt en zorchpak opgepakt.,Plukket opp en Zorchpak!,Zebrano Paczkę Zorch.,Pegou um Zorchpak!,Apanhaste um Zorchpak!,Ai ridicat un Ghiozdan Zorch!,Получен зорч-рюкзак!,Покупио си зорчпак.,Jag hämtade en Zorchpak!,Bir Zorchpak aldım!,Взято Зорч-сумку!
You got the LAZ Device! Woot!,GOTLAZDEVICE,,,,Získal@[ao_cs] jsi velkodosahový bzukr! Cooo?,Du fik LAZ-enheden! Woot!,Du hast den Flächenzorcher!,,Vi prenis la LAZ-aparaton! Hura!,¡Tienes el dispositivo LAZ! ¡Yuju!,,Sait SAZ-laitteen! Juhuu!,Vous avez pris l'Outil ZZL! Wahou!,Felvetted a LAZ Készüléket! Wáó!,Hai trovato il dispositivo LAZ! Cavolo!,LAZ デバイスをてにいれた! ワァオ!,LAZ 장치 습득! 완전 짱인걸!,Je hebt het LAZ-apparaat! Woot!,Du har LAZ-enheten! Woot!,Zdobył@[irreg_3_pl] urządzenie LAZ! Juhu!,Você achou o Dispositivo LAZ! Oba!,Apanhaste um Dispositivo LAZ! Fixe!,Ai ridicat un Dispozitiv LAZ! Uraa!,Получено устройство зорчирования большого радиуса! Ура!,Добио си ЛАЗ уређај. ВУТ!,Du fick LAZ-enheten! Woot!,LAZ cihazını aldın! Woot!,
You got the LAZ Device! Woot!,GOTLAZDEVICE,,,,Získal@[ao_cs] jsi velkodosahový bzukr! Cooo?,Du fik LAZ-enheden! Woot!,Du hast den Flächenzorcher!,,Vi prenis la LAZ-aparaton! Hura!,¡Tienes el dispositivo LAZ! ¡Yuju!,,Sait SAZ-laitteen! Juhuu!,Vous avez pris l'Outil ZZL! Wahou!,Felvetted a LAZ Készüléket! Wáó!,Hai trovato il dispositivo LAZ! Cavolo!,LAZ デバイスをてにいれた! ワァオ!,LAZ 장치 습득! 완전 짱인걸!,Je hebt het LAZ-apparaat! Woot!,Du har LAZ-enheten! Woot!,Zdobył@[irreg_3_pl] urządzenie LAZ! Juhu!,Você achou o Dispositivo LAZ! Oba!,Apanhaste um Dispositivo LAZ! Fixe!,Ai ridicat un Dispozitiv LAZ! Uraa!,Получено устройство зорчирования большого радиуса! Ура!,Добио си ЛАЗ уређај. ВУТ!,Du fick LAZ-enheten! Woot!,LAZ cihazını aldın! Woot!,Ти отримав пристрій LAZ! Супер!
You got the Rapid Zorcher!,GOTRAPIDZORCHER,,,,Získal@[ao_cs] jsi rychlobzukr!,Du fik en Rapid Zorcher!,Du hast den schnellen Zorcher genommen!,,Vi prenis la Rapidzorĉilon!,¡Tienes el Zorcher Rápido!,,Sait pikazorcherin!,Vous avez pris le Zorcheur Rapide!,Felvetted a Gyors Zorkert!,Hai trovato il zorcher rapido!,ラピッドゾーチャー をてにいれた!,속사 자쳐 습득!,Je hebt de snelle Zorcher!,Du har Rapid Zorcher!,Zdobył@[irreg_3_pl] Szybkostrzelny Zorcher!,Você pegou o Zorcher Automático!,Apanhaste o Zorcher Automático!,Ai ridicat un Zorcher cu Foc Rapid!,Получен скорострельный зорчер!,Добио си рапидан зорчер!,Du fick den snabba Zorcher!,Hızlı Zorcher'ı aldın!,
You got the Super Bootspork!,GOTSUPERBOOTSPORK,,,,Získal@[ao_cs] jsi super botovidličku!,Du fik Super Bootspork!,Du hast den Super-Gabelquirl genommen!,,Vi prenis la Superan Ŝargmanĝilaron!,¡Tienes el Súper Cuchador!,,Sait superluhan!,Vous avez pris la Super Fourchette!,Felvetted a Szuper Rotációs Villát!,Hai trovato il super bootspork!,スーパーさきわれスプーン をてにいれた!,부트스포크 습득!,Je hebt de Super Bootspork!,Du har Super Bootspork!,Zdobył@[irreg_3_pl] Super Łyżkowidelec!,Você pegou o Super Garfo!,Apanhaste o Super Garfo-Colher!,Ai ridicat o Super Lingură!,Получена суперложковилка!,Добио си супер чизмо-порк!,Du fick Super Bootspork!,Süper Bootspork'u aldın!,
You got the Zorch Propulsor!,GOTZORCHPROPULSOR,,,,Získal@[ao_cs] jsi bzukový propulsor!,Du fik Zorch-propulsoren!,Du hast den Propellerzorcher genommen!,,Vi prenis la Zorĉpropulsilon!,¡Tienes el Propulsor de Zorch!,,Sait zorchtyöntimen!,Vous avez pris le Propulseur Zorch!,Felvetted a Zork Elhárítót!,Hai trovato il propulsore zorch!,ロケット ゾーチャー をてにいれた!,저치 추진기 습득!,Je hebt de Zorch Propulsor!,Du fikk Zorch Propulsor!,Zdobył@[irreg_3_pl] Pędnik Zorch!,Você pegou o Propulsor de Zorch!,Apanhaste o Propulsor de Zorch!,Ai ridicat un Accelerator Zorch!,Получен ускоритель хорча!,Добио си зорч погон!,Du fick Zorch Propulsor!,Zorch Propulsor'u aldın!,
@ -3344,9 +3344,11 @@ Show time widget,ALTHUDMNU_SHOWTIMESTAT,,,,Zobrazit widget s časem,Vis tid widg
MBF21,OPTVAL_MBF21,,,,,,,,,,,,,,,,,,,,,,,,,,,
Crushed monsters get resurrected as ghosts,CMPTMNU_VILEGHOSTS,,,,Oživovat rozdrcené příšery jako duchy,Knuste monstre genopstår som spøgelser,Zermalmte Monster werden als Geister wiedererweckt,Συνθλιμένα τέρατα αναστήνοντε ως φαντάσματα,Dispremitaj monstroj reviviĝas kiel fantomojn,Los monstruos aplastados son resucitados como fantasmas,,Murskatut hirviöt heräävät henkiin aaveina...,Les monstres écrasés ressuscitent en fantômes,Összenyomott szörnyek szellemként születnek újra,Mostri schiacciati vengono resuscitati come fantasmi,圧死した敵が蘇生でゴースト化,분쇄된 몬스터는 유령으로 부활합니다.,Verpletterde monsters worden herrezen als geesten,Knuste monstre gjenoppstår som spøkelser,Zmiażdżone potwory wskrzeszone jako duchy,Monstros esmagados ressucitam como fantasmas,,Monștrii striviți sunt readuși la viață ca fantome.,Раздавленные монстры воскресают в виде призраков,Сломљена чудовишта васкрсавају као духови,Krossade monster återuppstår som spöken.,Ezilmiş canavarlar hayalet olarak dirilir,
View bobbing while flying,MISCMNU_FVIEWBOB,,,,Pohupování pohledu při létání,Vis bobbing mens du flyver,Waffenpendeln beim Fliegen,,Vidi kapo-balanciĝon dum flugado,La vista tambalea al volar,,,Chaloupage en vol,Nézet repüléskori billegése,,飛行中の視点揺れ,비행 중 흔들림 보기,Bekijk bob bedrag terwijl je vliegt,Se bobbing mens du flyr,Pokaż bujanie podczas lotu,Balanço na visão durante voo,,Mișcare cameră în timpul zborului,Покачивание камеры при полёте,Погледајте скакање током лета,Visa att det guppar när du flyger,Uçarken sallanmayı görüntüle,
%o was maimed by a Serpent.,OB_DEMON1HIT,,,,%o byl@[ao_cs] zmrzačen@[ao_cs] zlohadem.,%o blev lemlæstet af en slange.,%o wurde von einer Schlange zerfleischt.,,%o vundegiĝis de Serpento.,,,,%o a été mutilé@[e_fr] par un Serpent.,,,,,%o werd verminkt door een slang.,%o ble lemlestet av en slange.,Wąż skaleczył gracza %o,%o foi mutilad@[ao_ptb] por uma Serpente.,,,Игрок %o искалечен змеем.,,%o blev lemlästad av en orm.,"%o, bir yılan tarafından sakat bırakıldı.",
Antialias Lines,AUTOMAPMNU_LINEANTIALIASING,,,,Vyhlazovat čáry,,Linien glätten,,Glatigaj Linioj,,,,,,,,,,,Linie Antyaliasowe,Linhas com antiserrilhamento,,,Линии сглаживания,,,,
Move and shoot through other players,GMPLYMNU_NOPLAYERCLIP ,,,,,,Keine Kollisionen mit anderen Spielern,,,,,,,,,,,,,Brak kolizji z innymi graczami,Mover e atirar através de outros jogadores,,,Перемещение и стрельба через игроков,,,,
Share keys with all players,GMPLYMNU_SHAREKEYS,,,,,,Schlüssel mit allen Spielern teilen,,,,,,,,,,,,,Współdziel klucze z innymi graczami,Compartilhar chaves com todos os jogadores,,,Общие ключи игроков,,,,
Disallow override of camera facing mode,GLPREFMNU_SPRBILLFACECAMERAFORCE,,,,,,,,,,,,,,,,,,,Zabroń nadpisywania trybu widoku,Forçar modo de alinhamento do sprite à câmera,,,Запретить переопределение режима поворота камеры,,,,
Swap health and armor,ALTHUDMNU_SWAPHEALTHARMOR,,,,,,Anzeige für Gesundheit und Panzerung tauschen,,,,,,,,,,,,,Zamień zdrowie i pancerz,,,,Поменять отображение здоровья и брони местами,,,,
%o was maimed by a Serpent.,OB_DEMON1HIT,,,,%o byl@[ao_cs] zmrzačen@[ao_cs] zlohadem.,%o blev lemlæstet af en slange.,%o wurde von einer Schlange zerfleischt.,,%o vundegiĝis de Serpento.,,,,%o a été mutilé@[e_fr] par un Serpent.,,%o è stato mutilato da un serpente.,,,%o werd verminkt door een slang.,%o ble lemlestet av en slange.,Wąż skaleczył gracza %o,%o foi mutilad@[ao_ptb] por uma Serpente.,,,Игрок %o искалечен змеем.,,%o blev lemlästad av en orm.,"%o, bir yılan tarafından sakat bırakıldı.",
Antialias Lines,AUTOMAPMNU_LINEANTIALIASING,,,,Vyhlazovat čáry,Antialias-linjer,Linien glätten,,Glatigaj Linioj,,,,Lignes Antialias,,,,,Antialijnen,Antialias-linjer,Linie Antyaliasowe,Linhas com antiserrilhamento,,,Линии сглаживания,,Antialias Linjer,Antialias Hatları,
Move and shoot through other players,GMPLYMNU_NOPLAYERCLIP ,,,,,Bevæg dig og skyd gennem andre spillere,Keine Kollisionen mit anderen Spielern,,,,,,Déplacez-vous et tirez à travers les autres joueurs,,Muoversi e sparare attraverso gli altri giocatori,,,Beweeg en schiet door andere spelers,Beveg deg og skyt gjennom andre spillere,Brak kolizji z innymi graczami,Mover e atirar através de outros jogadores,,,Перемещение и стрельба через игроков,,Förflytta dig och skjut genom andra spelare,Diğer oyuncuların arasından geçin ve ateş edin,
Share keys with all players,GMPLYMNU_SHAREKEYS,,,,,Del nøgler med alle spillere,Schlüssel mit allen Spielern teilen,,,,,,Partager les clés avec tous les joueurs,,Condividere i tasti con tutti i giocatori,,,Deel toetsen met alle spelers,Del nøkler med alle spillere,Współdziel klucze z innymi graczami,Compartilhar chaves com todos os jogadores,,,Общие ключи игроков,,Dela nycklar med alla spelare,Anahtarları tüm oyuncularla paylaşın,
Disallow override of camera facing mode,GLPREFMNU_SPRBILLFACECAMERAFORCE,,,,,Tillad ikke tilsidesættelse af kameravendt tilstand,Änderung des Kameramodus nicht erlauben,,,,,,Interdiction de modifier le mode d'orientation de la caméra,,Disconoscimento della modalità telecamera,,,Overschrijven van camerastand verbieden,Tillat ikke overstyring av kameramodus,Zabroń nadpisywania trybu widoku,Forçar modo de alinhamento do sprite à câmera,,,Запретить переопределение режима поворота камеры,,Tillåt inte åsidosättande av kamerans vändläge,Kameraya bakma modunun geçersiz kılınmasına izin verme,
Swap health and armor,ALTHUDMNU_SWAPHEALTHARMOR,,,,,Byt om på helbred og rustning,Anzeige für Gesundheit und Panzerung tauschen,,,,,,Échanger la santé et l'armure,,Scambio di salute e armatura,,,Verwissel gezondheid en pantser,Bytt helse og rustning,Zamień zdrowie i pancerz,Trocar saúde e armadura,,,Поменять отображение здоровья и брони местами,,Byt hälsa och rustning,Sağlık ve zırhı değiştir,
Use classic HUD scaling,SCALEMNU_HUD_OLDSCALE,hud_oldscale,,,,Brug klassisk HUD-skalering,Klassische HUD-Skalierung,,,,,,Utiliser l'échelle classique du HUD,,Utilizzare la scalatura classica dell'HUD,,,Gebruik klassieke HUD-schaling,Bruk klassisk HUD-skalering,,Usar escala clássica do HUD,,,Классическое масштабирование интерфейса,,Använd klassisk HUD-skalning,Klasik HUD ölçeklendirmesini kullanın,
HUD scale factor,SCALEMNU_HUD_SCALEFACTOR,hud_scalefactor,,,,HUD-skaleringsfaktor,HUD-Skalierungsfaktor,,,,,,Facteur d'échelle du HUD,,Fattore di scala dell'HUD,,,HUD-schaalfactor,HUD-skaleringsfaktor,,Fator de escala do HUD,,,Значение масштабирования интерфейса,,Skalningsfaktor för HUD,HUD ölçek faktörü,
Can't render this file because it is too large.

View file

@ -1300,6 +1300,40 @@ class Actor : Thinker native
native version("4.12") void SetAnimationFrameRate(double framerate);
native version("4.12") ui void SetAnimationFrameRateUI(double framerate);
native version("4.12") void SetModelFlag(int flag);
native version("4.12") void ClearModelFlag(int flag);
native version("4.12") void ResetModelFlags();
action version("4.12") void A_SetAnimation(Name animName, double framerate = -1, int startFrame = -1, int loopFrame= -1, int interpolateTics = -1, int flags = 0)
{
invoker.SetAnimation(animName, framerate, startFrame, loopFrame, interpolateTics, flags);
}
action version("4.12") void A_SetAnimationFrameRate(double framerate)
{
invoker.SetAnimationFrameRate(framerate);
}
action version("4.12") void A_SetModelFlag(int flag)
{
invoker.SetModelFlag(flag);
}
action version("4.12") void A_ClearModelFlag(int flag)
{
invoker.ClearModelFlag(flag);
}
action version("4.12") void A_ResetModelFlags()
{
invoker.ResetModelFlags();
}
int ACS_NamedExecute(name script, int mapnum=0, int arg1=0, int arg2=0, int arg3=0)
{
return ACS_Execute(-int(script), mapnum, arg1, arg2, arg3);

View file

@ -1475,3 +1475,26 @@ const WATER_SINK_FACTOR = 0.125;
const WATER_SINK_SMALL_FACTOR = 0.25;
const WATER_SINK_SPEED = 0.5;
const WATER_JUMP_SPEED = 3.5;
// for SetModelFlag/ClearModelFlag
enum EModelFlags
{
// [BB] Color translations for the model skin are ignored. This is
// useful if the skin texture is not using the game palette.
MDL_IGNORETRANSLATION = 1<<0,
MDL_PITCHFROMMOMENTUM = 1<<1,
MDL_ROTATING = 1<<2,
MDL_INTERPOLATEDOUBLEDFRAMES = 1<<3,
MDL_NOINTERPOLATION = 1<<4,
MDL_USEACTORPITCH = 1<<5,
MDL_USEACTORROLL = 1<<6,
MDL_BADROTATION = 1<<7,
MDL_DONTCULLBACKFACES = 1<<8,
MDL_USEROTATIONCENTER = 1<<9,
MDL_NOPERPIXELLIGHTING = 1<<10, // forces a model to not use per-pixel lighting. useful for voxel-converted-to-model objects.
MDL_SCALEWEAPONFOV = 1<<11, // scale weapon view model with higher user FOVs
MDL_MODELSAREATTACHMENTS = 1<<12, // any model index after 0 is treated as an attachment, and therefore will use the bone results of index 0
MDL_CORRECTPIXELSTRETCH = 1<<13, // ensure model does not distort with pixel stretch when pitch/roll is applied
MDL_FORCECULLBACKFACES = 1<<14,
};