fixed some fps options (30, 40, 60, 120, and 240) (still buggy)

This commit is contained in:
Blake Warner 2022-04-12 18:22:44 -04:00
parent 8a40457543
commit 64b42a0ab7
8 changed files with 89 additions and 52 deletions

View File

@ -3,43 +3,41 @@
#include "ultra64/types.h"
#if defined(ENABLE_240FPS)
#define FRAME_RATE 240
#define ENABLE_HIGH_FRAMERATE
#define FRAME_RATE 60
#define UPDATE_SCALER 4
#elif defined(ENABLE_180FPS)
#define FRAME_RATE 60
#define UPDATE_SCALER 3
#elif defined(ENABLE_120FPS)
#define FRAME_RATE 120
#define ENABLE_HIGH_FRAMERATE
#define FRAME_RATE 60
#define UPDATE_SCALER 2
#elif defined(ENABLE_60FPS)
#define FRAME_RATE 60
#define UPDATE_SCALER 1
#elif defined(ENABLE_40FPS)
#define FRAME_RATE 40
#define UPDATE_SCALER 1
#elif defined(ENABLE_30FPS)
#define FRAME_RATE 30
#define FRAME_RATE 40
#define UPDATE_SCALER (40.0f / 30.0f)
#elif defined(ENABLE_25FPS)
#define FRAME_RATE 20
#define UPDATE_SCALER (30.0f / 20.0f)
#else
#define FRAME_RATE 20
#define UPDATE_SCALER 1
#endif
#ifdef ENABLE_HIGH_FRAMERATE
typedef enum
enum Framerate
{
FRAMERATE_NONE = 0,
FRAMERATE_240FPS = 1,
FRAMERATE_120FPS = 2,
FRAMERATE_60FPS = 4,
FRAMERATE_40FPS = 6,
FRAMERATE_30FPS = 8,
FRAMERATE_20FPS = 12
} Framerate;
#define FRAMERATE_SCALER R_UPDATE_RATE / 12.0f
#define FRAMERATE_RATE_SCALER 4
#define FRAMERATE_MAX 240
#else
typedef enum
{
FRAMERATE_NONE = 0,
FRAMERATE_60FPS = 1,
FRAMERATE_30FPS = 2,
FRAMERATE_20FPS = 3
} Framerate;
FRAMERATE_240FPS = 2,
FRAMERATE_120FPS = 5,
FRAMERATE_60FPS = 10,
FRAMERATE_40FPS = 15,
FRAMERATE_30FPS = 20,
FRAMERATE_20FPS = 30
};
#define FRAMERATE_SCALER (20.0f / (float)FRAME_RATE)
#define FRAMERATE_SCALER_INV ((float)FRAME_RATE / 20.0f)
@ -47,8 +45,6 @@ typedef enum
#define FRAMERATE_RATE_SCALER 1
#define FRAMERATE_MAX 60
#endif
#define FRAMERATE_RATE_SCALE(x) ((x / FRAMERATE_RATE_SCALER) < 1 ? 1 : (x / FRAMERATE_RATE_SCALER))
#define FRAMERATE_RATE_SCALED ((R_UPDATE_RATE / FRAMERATE_RATE_SCALER) < 1 ? 1 : (R_UPDATE_RATE / FRAMERATE_RATE_SCALER))
#define FRAME_TIME (1.0f / (float)FRAME_RATE)
@ -71,7 +67,7 @@ void framerate_init();
u32 framerate_get();
void framerate_set_profile(FramerateProfile profile);
FramerateProfile framerate_get_profile();
u64 frameRateDivisor();
float frameRateDivisor();
class Timer
{

View File

@ -47,7 +47,7 @@
#define R_ENV_TIME_INCREMENT REG(15)
#define R_RUN_SPEED_LIMIT REG(45)
#define R_ENABLE_ARENA_DBG SREG(0)
#define R_UPDATE_RATE SREG(30)
extern float R_UPDATE_RATE;
#define R_ENABLE_AUDIO_DBG SREG(36)
#define R_FB_FILTER_TYPE SREG(80)
#define R_FB_FILTER_PRIM_COLOR(c) SREG(81 + c)

View File

@ -62,7 +62,7 @@ def main():
parser.add_argument("-p", "--props-only", help="Only sets project properties / options (does not extract assets)", action="store_true", default=False)
parser.add_argument("-co", "--clean-only", help="Cleans environment without asset extraction", action="store_true", default=False)
parser.add_argument("-b", "--buildRom", choices=validBuildOptions(), help="build rom config ex: EUR_MQD")
parser.add_argument("-f", "--framerate", choices=['20', '30', '60', '120', '240'], help="game framerate", default='20')
parser.add_argument("-f", "--framerate", choices=['20', '25', '30', '40', '60', '120', '240'], help="game framerate", default='20')
parser.add_argument("-m", "--enable-mouse", help="Enables mouse controls", action="store_true", default=True)
parser.add_argument("--refresh-configs", help="Refreshes rom config files (do not use)", action="store_true", default=False)
parser.add_argument("-o", "--organize-roms", help="Renames and moves roms to their proper location", action="store_true", default=False)

View File

@ -6,8 +6,11 @@
#define COUNTER_STEP 20 / FRAME_RATE
#define COUNTER_SCALER FRAME_RATE / 20
float R_UPDATE_RATE = 1.0f;
static FramerateProfile g_profile = PROFILE_BOOT;
#define REAL_FRAME_RATE 30
#if FRAME_RATE == 20
static Framerate g_profileRates[] = {
FRAMERATE_30FPS, // PROFILE_BOOT
@ -21,6 +24,32 @@ static Framerate g_profileRates[] = {
FRAMERATE_60FPS, // PROFILE_TITLE
FRAMERATE_60FPS, // PROFILE_FILE_CHOOSE
};
#elif FRAME_RATE == 30
static Framerate g_profileRates[] = {
FRAMERATE_30FPS, // PROFILE_BOOT
FRAMERATE_60FPS, // PROFILE_PAUSE
FRAMERATE_30FPS, // PROFILE_GAMEPLAY
FRAMERATE_60FPS, // PROFILE_UNKNOWN1
FRAMERATE_60FPS, // PROFILE_UNKNOWN2
FRAMERATE_60FPS, // PROFILE_SAMPLE
FRAMERATE_60FPS, // PROFILE_OPENING
FRAMERATE_60FPS, // PROFILE_SELECT
FRAMERATE_60FPS, // PROFILE_TITLE
FRAMERATE_60FPS, // PROFILE_FILE_CHOOSE
};
#elif FRAME_RATE == 40
static Framerate g_profileRates[] = {
FRAMERATE_30FPS, // PROFILE_BOOT
FRAMERATE_60FPS, // PROFILE_PAUSE
FRAMERATE_40FPS, // PROFILE_GAMEPLAY
FRAMERATE_60FPS, // PROFILE_UNKNOWN1
FRAMERATE_60FPS, // PROFILE_UNKNOWN2
FRAMERATE_60FPS, // PROFILE_SAMPLE
FRAMERATE_60FPS, // PROFILE_OPENING
FRAMERATE_60FPS, // PROFILE_SELECT
FRAMERATE_60FPS, // PROFILE_TITLE
FRAMERATE_60FPS, // PROFILE_FILE_CHOOSE
};
#else
static Framerate g_profileRates[] = {
FRAMERATE_30FPS, // PROFILE_BOOT
@ -44,16 +73,14 @@ u32 framerate_get()
{
switch(g_profileRates[g_profile])
{
#ifdef ENABLE_HIGH_FRAMERATE
case FRAMERATE_240FPS:
return 240;
case FRAMERATE_120FPS:
return 120;
case FRAMERATE_40FPS:
return 40;
#endif
case FRAMERATE_60FPS:
return 60;
case FRAMERATE_40FPS:
return 40;
case FRAMERATE_30FPS:
return 30;
case FRAMERATE_20FPS:
@ -62,11 +89,31 @@ u32 framerate_get()
return 20; // ERROR?
}
static inline float framerate_divider()
{
switch(g_profileRates[g_profile])
{
case FRAMERATE_240FPS:
return 0.25f;
case FRAMERATE_120FPS:
return 0.5f;
case FRAMERATE_60FPS:
return 1.0f;
case FRAMERATE_40FPS:
return 2.0f;
case FRAMERATE_30FPS:
return 1.5f;
case FRAMERATE_20FPS:
return 3.0f;
}
return 20; // ERROR?
}
void framerate_set_profile(FramerateProfile profile)
{
u64 i = 1 * REG_PER_GROUP + 30;
g_profile = profile;
R_UPDATE_RATE = g_profileRates[g_profile];
R_UPDATE_RATE = framerate_divider();
}
FramerateProfile framerate_get_profile()
@ -74,7 +121,7 @@ FramerateProfile framerate_get_profile()
return g_profile;
}
u64 frameRateDivisor()
float frameRateDivisor()
{
return R_UPDATE_RATE;
}
@ -337,7 +384,7 @@ Step::Step(const Step& t)
Step::Step(float n)
{
//m_value = n; // * FRAMERATE_SCALER;
m_value = n * FRAMERATE_SCALER;
m_value = n * COUNTER_STEP;
}
Step::Step(const Rotation& r)

View File

@ -184,10 +184,6 @@ void Graph_TaskSet00(GraphicsContext* gfxCtx)
task->data_size = (uintptr_t)WORK_DISP - (uintptr_t)gfxCtx->workBuffer;
CLOSE_DISPS(gfxCtx, "../graph.c", 830);
{
s32 pad2;
} // Necessary to match stack usage
task->yield_data_ptr = (u64*)gGfxSPTaskYieldBuffer;
task->yield_data_size = sizeof(gGfxSPTaskYieldBuffer);

View File

@ -15,10 +15,7 @@
#include "def/z_skelanime.h"
#include "def/z_std_dma.h"
// TODO FIX THIS HACK
// DECLARE_SEGMENT(link_animetion)
#define FMV2 (R_UPDATE_RATE * 1.0f / 3.0 /** FRAMERATE_SCALER*/)
#define FMV2 (R_UPDATE_RATE * 1.0f / 3.0)
#define LINK_ANIMATION_OFFSET2(addr, offset) (((uintptr_t)_link_animetionSegmentRomStart) + ((uintptr_t)offset))
@ -937,7 +934,7 @@ void AnimationContext_SetLoadFrame(GlobalContext* globalCtx, LinkAnimationHeader
const auto frame1 = frame.whole();
memcpy(ram, (const void*)(Vec3s*)LINK_ANIMATION_OFFSET(linkAnimHeader->segment, ((sizeof(Vec3s) * limbCount + 2) * frame1)), sizeof(Vec3s) * limbCount + 2);
#if FRAME_RATE > 20
#if FRAME_RATE > 40
const auto frame2 = (frame1 + 1);
if(frame2 < linkAnimHeader->common.frameCount)
@ -1723,7 +1720,7 @@ static s32 SkelAnime_MorphTaper(GlobalContext* context, SkelAnime* skelAnime)
return 0;
}
#if FRAME_RATE > 20
#if FRAME_RATE > 40
#define FORCE_INTERPOL true
#else
#define FORCE_INTERPOL false

View File

@ -1,6 +1,7 @@
#pragma once
#include <chrono>
#include <memory>
#include "framerate.h"
#include "ultra64/types.h"
namespace platform::window
@ -31,7 +32,7 @@ namespace platform::window
void setTargetFrameRate(size_t rate)
{
m_targetFrameRate = rate;
m_targetFrameRate = rate * UPDATE_SCALER;
};
float ar()
{

View File

@ -9,8 +9,8 @@
namespace platform::window
{
Base::Base() :
/*m_nextFrameTime(0), m_currentFrameStartTime(0), m_lastFrameTime(0),*/ m_lastFrameDuration(0), m_lastSwapDuration(0), dropped_frame(false), m_refreshInterval(0), m_targetFrameRate(60), m_ar_ratio(1.0f), m_ar(1.0f), m_window_width(1280),
m_window_height(720)
/*m_nextFrameTime(0), m_currentFrameStartTime(0), m_lastFrameTime(0),*/ m_lastFrameDuration(0), m_lastSwapDuration(0), dropped_frame(false), m_refreshInterval(0), m_targetFrameRate(60 * UPDATE_SCALER), m_ar_ratio(1.0f), m_ar(1.0f),
m_window_width(1280), m_window_height(720)
{
}