captainys / TOWNSEMU

FM Towns Emulator "Tsugaru"
BSD 3-Clause "New" or "Revised" License
238 stars 17 forks source link

Top line not visible #37

Closed pinterior closed 2 years ago

pinterior commented 2 years ago

with Tsugaru_CUI's default window size, top line is not visible. bottom line looks fine, but there is 1px gap under the status line.

default size

image

increased height a little

image

gap under status line

image

fuzz6001 commented 2 years ago

便乗で申し訳ないのですが、CUIとGUIでウィンドウサイズが違うという問題を思い出しました。 意図的であればかまわないのですが。

F-BASIC386でテスト。 赤ラインが最外周、緑ラインが1ドット内側です。 OSはWindows 10です。

CUI

cui

GUI

gui

captainys commented 2 years ago

おおなるほど。まったく気づきませんでした。OpenGLのglDrawPixelsはRaster Positionが1ピクセルでも画面外だと絵をまったく表示しないので、左下座標を(0,479)にしていたのが多分問題ですね。ステータスバーが無かったころはぎりぎり(0,480)にしてしまうと中で浮動小数点で持ってるはずなので画面外判定される心配があったのですが、今はステータスバーを出しているので、(0,480)にしても絶対画面内と判定されるので、この際ステータスバーが1ピクセルぐらい食われてもあまり気にならないので、そのようにして解決しようかな。

pinterior commented 2 years ago

OpenGLはさっぱりわかっていないのですが、このようにglRasterPos2i で画面外(?)を指さないようにすればよい感じでしょうか?

diff --git a/src/externals/connect_fssimplewindow/fssimplewindow_connection.cpp b/src/externals/connect_fssimplewindow/fssimplewindow_connection.cpp
index 081e02f..2289aeb 100644
--- a/src/externals/connect_fssimplewindow/fssimplewindow_connection.cpp
+++ b/src/externals/connect_fssimplewindow/fssimplewindow_connection.cpp
@@ -1354,11 +1354,13 @@ void FsSimpleWindowConnection::RenderBeforeSwapBuffers(const TownsRender::Image
        glOrtho(0.0f,float(winWid),float(winHei),0.0f,-1,1);

        glPixelZoom((float)scaling/100.0f,(float)scaling/100.0f);
-       glRasterPos2i(this->dx,(img.hei*scaling/100)+dy-1);
+       glRasterPos2i(0, 0);
+       glBitmap(0, 0, 0, 0, this->dx, -(int)(renderHei + dy), NULL);
        glDrawPixels(img.wid,img.hei,GL_RGBA,GL_UNSIGNED_BYTE,img.rgba);

-       glRasterPos2i(0,winHei-1);
+       glRasterPos2i(0, 0);
        glPixelZoom(1,1);
+       glBitmap(0, 0, 0, 0, 0, -winHei, NULL);
        glDrawPixels(STATUS_WID,STATUS_HEI,GL_RGBA,GL_UNSIGNED_BYTE,statusBitmap);

        switch(lowerRightIcon)
captainys commented 2 years ago

いや、多分単純に glRasterPos2i(this->dx,(img.heiscaling/100)+dy-1); を glRasterPos2i(this->dx,(img.heiscaling/100)+dy); にするだけで直りそうな気がするので、そのように修正したソースをPUSHしたので試してみてください。多分ステータスバーと重なるのでTownsのスクリーンイメージはステータスバーの上に描くように順も入れ替えました。

pinterior commented 2 years ago

現masterで直っていると思います。 上のパッチは、何かの拍子――例えばウィンドウを小さくしたとき――に画面外判定されることを懸念しての -1 であったのなら、-1 しない座標が画面外であってもレンダリングされるようにすればよいのではないかという意図でした。(現物あわせで書いていて、なぜyが逆方向なのかもよくわかっていないのですが)

captainys commented 2 years ago

なぜか掲示板の方に書けなくなってしまったんで、こっちに便乗すると、spriteを調べたところ、Galaxy ForceはSpriteがbusyになるタイミングでまだスプライトの移動などが終了していないようです。そのため、スプライトのレンダリングをbusyになるタイミングにすると早すぎて、まだスプライトの位置が設定し終わっていないため、いくつかのスプライトが表示されていなかったようです。これを、readyになるタイミングでレンダリングするように切り替えてやるとすべてのスプライトが表示されるようになりました。FREQを上げてやると、それだけ早くスプライトの更新が進むのでbusyに間に合っていたというもののようです。

しかし、busyになったタイミングで一気にレンダリングしてしまえばいいのか、と、思った理由があった気がしたような。。。。あ、Shadow of the Beastが途中でSPEN切ってしまうからreadyになるタイミングが(スケジュール上は)発生しない問題だったか。やっぱりSPEN切ったときにspriteがbusyだった場合もレンダリングするように修正するのがいいかな? この方法だと新しいフラグとかいらないんで良いかな。あるいは、レンダリングを開始した(ことにする)フラグを追加して、スケジュールタスクの方で、SPENまたはisRenderingのどっちかがtrueの場合はレンダリングするという書き換えでもいいかな。isRenderingはステートファイルに保存しなくても1フレームロスするだけだから多分問題無さそう。

この点はShadow of the Beasts対策があるので、こっちで直そうと思います。今日の晩はボウリングの試合があるので、明日中にはなんとかできると思います。

pinterior commented 2 years ago

スプライトに関しては #38 でお願いします