From 6ca0743f50f47884b9c51a517920d5c34657ce85 Mon Sep 17 00:00:00 2001 From: 0auBSQ <58159635+0auBSQ@users.noreply.github.com> Date: Fri, 26 Jul 2024 21:39:38 +0900 Subject: [PATCH] cleanup --- FDK/src/04.Graphics/CTexture.cs | 1829 ++++++++--------- OpenTaiko/src/Common/Program.cs | 1 - OpenTaiko/src/Common/SaveFile.cs | 12 +- OpenTaiko/src/Common/TJAPlayer3.cs | 24 +- OpenTaiko/src/Databases/DBSaves.cs | 38 +- OpenTaiko/src/Items/CItemBase.cs | 42 +- OpenTaiko/src/Lua/CLuaScript.cs | 388 ++-- OpenTaiko/src/Lua/Infos/CLuaFps.cs | 18 +- OpenTaiko/src/Lua/Infos/CLuaInfo.cs | 33 +- .../src/Lua/Scripts/CLuaNamePlateScript.cs | 98 +- OpenTaiko/src/Stages/CNamePlate.cs | 140 +- 11 files changed, 1178 insertions(+), 1445 deletions(-) diff --git a/FDK/src/04.Graphics/CTexture.cs b/FDK/src/04.Graphics/CTexture.cs index 8e6afc8b..fa4f3ff7 100644 --- a/FDK/src/04.Graphics/CTexture.cs +++ b/FDK/src/04.Graphics/CTexture.cs @@ -1,86 +1,75 @@ -using System; -using System.Collections.Generic; -using System.Text; -using System.Drawing; -using System.Drawing.Imaging; -using System.IO; -using System.Diagnostics; +using System.Drawing; +using SampleFramework; using Silk.NET.Maths; +using Silk.NET.OpenGLES; using SkiaSharp; - +using Point = System.Drawing.Point; using Rectangle = System.Drawing.Rectangle; using RectangleF = System.Drawing.RectangleF; -using Point = System.Drawing.Point; -using Color = System.Drawing.Color; -using SampleFramework; -using Silk.NET.OpenGLES; -namespace FDK -{ - public class CTexture : IDisposable - { - /// - /// バッファの集まり - /// - private static uint VAO; +namespace FDK { + public class CTexture : IDisposable { + /// + /// バッファの集まり + /// + private static uint VAO; - /// - /// 頂点バッファ - /// - private static uint VBO; + /// + /// 頂点バッファ + /// + private static uint VBO; - /// - /// 頂点バッファの使用順バッファ - /// - private static uint EBO; + /// + /// 頂点バッファの使用順バッファ + /// + private static uint EBO; - /// - /// テクスチャで使用するUV座標バッファ - /// - private static uint UVBO; + /// + /// テクスチャで使用するUV座標バッファ + /// + private static uint UVBO; - /// - /// 頂点バッファの使用順の数 - /// - private static uint IndicesCount; + /// + /// 頂点バッファの使用順の数 + /// + private static uint IndicesCount; - /// - /// シェーダー - /// - private static uint ShaderProgram; + /// + /// シェーダー + /// + private static uint ShaderProgram; - /// - /// 移動、回転、拡大縮小に使うMatrixのハンドル - /// - private static int MVPID; + /// + /// 移動、回転、拡大縮小に使うMatrixのハンドル + /// + private static int MVPID; - /// - /// 色合いのハンドル - /// - private static int ColorID; + /// + /// 色合いのハンドル + /// + private static int ColorID; - /// - /// 拡大率のハンドル - /// - private static int ScaleID; + /// + /// 拡大率のハンドル + /// + private static int ScaleID; - /// - /// テクスチャの切り抜きのハンドル - /// - private static int TextureRectID; + /// + /// テクスチャの切り抜きのハンドル + /// + private static int TextureRectID; - private static int CameraID; + private static int CameraID; - private static int NoteModeID; + private static int NoteModeID; - /// - /// 描画に使用する共通のバッファを作成 - /// - public static void Init() - { - //シェーダーを作成、実際のコードはCreateShaderProgramWithShaderを見てください - ShaderProgram = ShaderHelper.CreateShaderProgramFromSource( - @"#version 100 + /// + /// 描画に使用する共通のバッファを作成 + /// + public static void Init() { + //シェーダーを作成、実際のコードはCreateShaderProgramWithShaderを見てください + ShaderProgram = ShaderHelper.CreateShaderProgramFromSource( + @"#version 100 precision mediump float; attribute vec3 aPosition; @@ -100,8 +89,8 @@ namespace FDK texcoord = vec2(aUV.x, aUV.y); gl_Position = position; }" - , - @"#version 100 + , + @"#version 100 precision mediump float; uniform vec4 color; @@ -126,943 +115,797 @@ namespace FDK } gl_FragColor = texture2D(texture1, rect) * color; }" - ); - //------ + ); + //------ - //シェーダーに値を送るためのハンドルを取得------ - MVPID = Game.Gl.GetUniformLocation(ShaderProgram, "mvp"); //拡大縮小、移動、回転のMatrix - ColorID = Game.Gl.GetUniformLocation(ShaderProgram, "color"); //色合い - ScaleID = Game.Gl.GetUniformLocation(ShaderProgram, "scale"); //スケール - TextureRectID = Game.Gl.GetUniformLocation(ShaderProgram, "textureRect"); //テクスチャの切り抜きの座標と大きさ - CameraID = Game.Gl.GetUniformLocation(ShaderProgram, "camera"); //テクスチャの切り抜きの座標と大きさ - NoteModeID = Game.Gl.GetUniformLocation(ShaderProgram, "noteMode"); //テクスチャの切り抜きの座標と大きさ + //シェーダーに値を送るためのハンドルを取得------ + MVPID = Game.Gl.GetUniformLocation(ShaderProgram, "mvp"); //拡大縮小、移動、回転のMatrix + ColorID = Game.Gl.GetUniformLocation(ShaderProgram, "color"); //色合い + ScaleID = Game.Gl.GetUniformLocation(ShaderProgram, "scale"); //スケール + TextureRectID = Game.Gl.GetUniformLocation(ShaderProgram, "textureRect"); //テクスチャの切り抜きの座標と大きさ + CameraID = Game.Gl.GetUniformLocation(ShaderProgram, "camera"); //テクスチャの切り抜きの座標と大きさ + NoteModeID = Game.Gl.GetUniformLocation(ShaderProgram, "noteMode"); //テクスチャの切り抜きの座標と大きさ - //------ + //------ - //2DSprite専用のバッファーを作成する... なんとVAOは一つでOK! + //2DSprite専用のバッファーを作成する... なんとVAOは一つでOK! - //VAOを作成---- - VAO = Game.Gl.GenVertexArray(); - Game.Gl.BindVertexArray(VAO); - //---- + //VAOを作成---- + VAO = Game.Gl.GenVertexArray(); + Game.Gl.BindVertexArray(VAO); + //---- - //VBOを作成----- - float[] vertices = new float[] //頂点データ + //VBOを作成----- + float[] vertices = new float[] //頂点データ { //x, y, z -1.0f, 1.0f, 0.0f, - 1.0f, 1.0f, 0.0f, - -1.0f, -1.0f, 0.0f, - 1.0f, -1.0f, 0.0f, - }; - VBO = Game.Gl.GenBuffer(); //頂点バッファを作る - Game.Gl.BindBuffer(BufferTargetARB.ArrayBuffer, VBO); //頂点バッファをバインドをする - unsafe + 1.0f, 1.0f, 0.0f, + -1.0f, -1.0f, 0.0f, + 1.0f, -1.0f, 0.0f, + }; + VBO = Game.Gl.GenBuffer(); //頂点バッファを作る + Game.Gl.BindBuffer(BufferTargetARB.ArrayBuffer, VBO); //頂点バッファをバインドをする + unsafe { + fixed (float* data = vertices) { + Game.Gl.BufferData(BufferTargetARB.ArrayBuffer, (nuint)(vertices.Length * sizeof(float)), data, BufferUsageARB.StaticDraw); //VRAMに頂点データを送る + } + } + + uint locationPosition = (uint)Game.Gl.GetAttribLocation(ShaderProgram, "aPosition"); + Game.Gl.EnableVertexAttribArray(locationPosition); //layout (location = 0)を使用可能に + unsafe { + Game.Gl.VertexAttribPointer(locationPosition, 3, VertexAttribPointerType.Float, false, 3 * sizeof(float), (void*)0); //float3個で一つのxyzの塊として頂点を作る + } + //----- + + + + //EBOを作成------ + //普通に四角を描画すると頂点データのxyzの塊が6個も必要だけど四つだけ作成して読み込む順番をこうやって登録すればメモリが少なくなる! + + EBO = Game.Gl.GenBuffer(); //頂点バッファの使用順バッファを作る + Game.Gl.BindBuffer(BufferTargetARB.ElementArrayBuffer, EBO); //頂点バッファの使用順バッファをバインドする + + uint[] indices = new uint[] // { - fixed (float* data = vertices) - { - Game.Gl.BufferData(BufferTargetARB.ArrayBuffer, (nuint)(vertices.Length * sizeof(float)), data, BufferUsageARB.StaticDraw); //VRAMに頂点データを送る - } - } - - uint locationPosition = (uint)Game.Gl.GetAttribLocation(ShaderProgram, "aPosition"); - Game.Gl.EnableVertexAttribArray(locationPosition); //layout (location = 0)を使用可能に - unsafe - { - Game.Gl.VertexAttribPointer(locationPosition, 3, VertexAttribPointerType.Float, false, 3 * sizeof(float), (void*)0); //float3個で一つのxyzの塊として頂点を作る - } - //----- - - - - //EBOを作成------ - //普通に四角を描画すると頂点データのxyzの塊が6個も必要だけど四つだけ作成して読み込む順番をこうやって登録すればメモリが少なくなる! - - EBO = Game.Gl.GenBuffer(); //頂点バッファの使用順バッファを作る - Game.Gl.BindBuffer(BufferTargetARB.ElementArrayBuffer, EBO); //頂点バッファの使用順バッファをバインドする - - uint[] indices = new uint[] // - { - 0, 1, 2, - 2, 1, 3 - }; - IndicesCount = (uint)indices.Length; //数を登録する - unsafe - { - fixed (uint* data = indices) - { - Game.Gl.BufferData(BufferTargetARB.ElementArrayBuffer, (nuint)(indices.Length * sizeof(uint)), data, BufferUsageARB.StaticDraw); //VRAMに送る - } - } - //----- - - //テクスチャの読み込みに使用するUV座標のバッファを作成、処理はVBOと大体同じ - UVBO = Game.Gl.GenBuffer(); - Game.Gl.BindBuffer(BufferTargetARB.ArrayBuffer, UVBO); - - float[] uvs = new float[] - { - 0.0f, 0.0f, - 1.0f, 0.0f, - 0.0f, 1.0f, - 1.0f, 1.0f, - }; - unsafe - { - fixed (float* data = uvs) - { - Game.Gl.BufferData(BufferTargetARB.ArrayBuffer, (nuint)(uvs.Length * sizeof(float)), data, BufferUsageARB.StaticDraw); - } - } - - uint locationUV = (uint)Game.Gl.GetAttribLocation(ShaderProgram, "aUV"); - Game.Gl.EnableVertexAttribArray(locationUV); - unsafe - { - Game.Gl.VertexAttribPointer(locationUV, 2, VertexAttribPointerType.Float, false, 2 * sizeof(float), (void*)0); - } - //----- - - - //バインドを解除 厳密には必須ではないが何かのはずみでバインドされたままBufferSubDataでデータが更新されたらとかされたらまあ大変----- - Game.Gl.BindVertexArray(0); - Game.Gl.BindBuffer(BufferTargetARB.ArrayBuffer, 0); - Game.Gl.BindBuffer(BufferTargetARB.ElementArrayBuffer, 0); - //----- - - - } - - /// - /// 描画に使用する共通のバッファを解放 - /// - public static void Terminate() - { - //ちゃんとバッファは解放すること - Game.Gl.DeleteVertexArray(VAO); - Game.Gl.DeleteBuffer(VBO); - Game.Gl.DeleteBuffer(EBO); - Game.Gl.DeleteBuffer(UVBO); - Game.Gl.DeleteProgram(ShaderProgram); - } - - // プロパティ - public bool b加算合成 - { - get; - set; - } - public bool b乗算合成 - { - get; - set; - } - public bool b減算合成 - { - get; - set; - } - public bool bスクリーン合成 - { - get; - set; - } - public float fZ軸中心回転 - { - get; - set; - } - public float fZRotation - { - get => fZ軸中心回転; - set { fZ軸中心回転 = value; } - } - public int Opacity - { - get - { - return this._opacity; - } - set - { - if (value < 0) - { - this._opacity = 0; - } - else if (value > 0xff) - { - this._opacity = 0xff; - } - else - { - this._opacity = value; - } - } - } - public Size szTextureSize - { - get; - private set; - } - public Size sz画像サイズ - { - get; - protected set; - } - public Vector3D vcScaleRatio; - - // 画面が変わるたび以下のプロパティを設定し治すこと。 - - public static Size sz論理画面 = Size.Empty; - public static Size sz物理画面 = Size.Empty; - public static Rectangle rc物理画面描画領域 = Rectangle.Empty; - /// - /// 論理画面を1とする場合の物理画面の倍率。 - /// 論理値×画面比率=物理値。 - /// - public static float f画面比率 = 1.0f; - - internal uint Texture_; - - // コンストラクタ - - public CTexture() - { - this.sz画像サイズ = new Size(0, 0); - this.szTextureSize = new Size(0, 0); - this._opacity = 0xff; - this.b加算合成 = false; - this.fZ軸中心回転 = 0f; - this.vcScaleRatio = new Vector3D(1f, 1f, 1f); - // this._txData = null; - } - - public CTexture(CTexture tx) - { - this.sz画像サイズ = tx.sz画像サイズ; - this.szTextureSize = tx.szTextureSize; - this._opacity = tx._opacity; - this.b加算合成 = tx.b加算合成; - this.fZ軸中心回転 = tx.fZ軸中心回転; - this.vcScaleRatio = tx.vcScaleRatio; - Texture_ = tx.Texture_; - // this._txData = null; - } - - public void UpdateTexture(CTexture texture, int n幅, int n高さ) - { - Texture_ = texture.Texture_; - this.sz画像サイズ = new Size(n幅, n高さ); - this.szTextureSize = this.t指定されたサイズを超えない最適なテクスチャサイズを返す(this.sz画像サイズ); - this.rc全画像 = new Rectangle(0, 0, this.sz画像サイズ.Width, this.sz画像サイズ.Height); - } - - public void UpdateTexture(IntPtr texture, int width, int height, PixelFormat rgbaType) - { - unsafe - { - Game.Gl.DeleteTexture(Texture_); //解放 - void* data = texture.ToPointer(); - Texture_ = GenTexture(data, (uint)width, (uint)height, rgbaType); - } - this.sz画像サイズ = new Size(width, height); - this.szTextureSize = this.t指定されたサイズを超えない最適なテクスチャサイズを返す(this.sz画像サイズ); - this.rc全画像 = new Rectangle(0, 0, this.sz画像サイズ.Width, this.sz画像サイズ.Height); - } - - /// - /// 指定されたビットマップオブジェクトから Managed テクスチャを作成する。 - /// テクスチャのサイズは、BITMAP画像のサイズ以上、かつ、D3D9デバイスで生成可能な最小のサイズに自動的に調節される。 - /// その際、テクスチャの調節後のサイズにあわせた画像の拡大縮小は行わない。 - /// その他、ミップマップ数は 1、Usage は None、Pool は Managed、イメージフィルタは Point、ミップマップフィルタは - /// None、カラーキーは 0xFFFFFFFF(完全なる黒を透過)になる。 - /// - /// Direct3D9 デバイス。 - /// 作成元のビットマップ。 - /// テクスチャのフォーマット。 - /// テクスチャの作成に失敗しました。 - public CTexture(SKBitmap bitmap) - : this() - { - try - { - MakeTexture(bitmap, false); - } - catch (Exception e) - { - this.Dispose(); - throw new CTextureCreateFailedException("ビットマップからのテクスチャの生成に失敗しました。", e); - } - } - - public CTexture(int n幅, int n高さ) - : this() - { - try - { - this.sz画像サイズ = new Size(n幅, n高さ); - this.szTextureSize = this.t指定されたサイズを超えない最適なテクスチャサイズを返す(this.sz画像サイズ); - this.rc全画像 = new Rectangle(0, 0, this.sz画像サイズ.Width, this.sz画像サイズ.Height); - } - catch - { - this.Dispose(); - throw new CTextureCreateFailedException(string.Format("テクスチャの生成に失敗しました。\n({0}x{1}, {2})", n幅, n高さ)); - } - } - - /// - /// 画像ファイルからテクスチャを生成する。 - /// 利用可能な画像形式は、BMP, JPG, PNG, TGA, DDS, PPM, DIB, HDR, PFM のいずれか。 - /// テクスチャのサイズは、画像のサイズ以上、かつ、D3D9デバイスで生成可能な最小のサイズに自動的に調節される。 - /// その際、テクスチャの調節後のサイズにあわせた画像の拡大縮小は行わない。 - /// その他、ミップマップ数は 1、Usage は None、イメージフィルタは Point、ミップマップフィルタは None になる。 - /// - /// Direct3D9 デバイス。 - /// 画像ファイル名。 - /// テクスチャのフォーマット。 - /// 画像の黒(0xFFFFFFFF)を透過させるなら true。 - /// テクスチャの管理方法。 - /// テクスチャの作成に失敗しました。 - public CTexture(string strファイル名, bool b黒を透過する) - : this() - { - MakeTexture(strファイル名, b黒を透過する); - } - public void MakeTexture(string strファイル名, bool b黒を透過する) - { - if (!File.Exists(strファイル名)) // #27122 2012.1.13 from: ImageInformation では FileNotFound 例外は返ってこないので、ここで自分でチェックする。わかりやすいログのために。 - throw new FileNotFoundException(string.Format("ファイルが存在しません。\n[{0}]", strファイル名)); - - SKBitmap bitmap = SKBitmap.Decode(strファイル名); - MakeTexture(bitmap, b黒を透過する); - bitmap.Dispose(); - } - - public CTexture(SKBitmap bitmap, bool b黒を透過する) - : this() - { - MakeTexture(bitmap, b黒を透過する); - } - - private unsafe uint GenTexture(void* data, uint width, uint height, PixelFormat pixelFormat) - { - //テクスチャハンドルの作成----- - uint handle = Game.Gl.GenTexture(); - Game.Gl.BindTexture(TextureTarget.Texture2D, handle); - //----- - - //テクスチャのデータをVramに送る - Game.Gl.TexImage2D(TextureTarget.Texture2D, 0, (int)pixelFormat, width, height, 0, pixelFormat, GLEnum.UnsignedByte, data); - //----- - - //拡大縮小の時の補完を指定------ - Game.Gl.TexParameterI(GLEnum.Texture2D, GLEnum.TextureMinFilter, (int)TextureMinFilter.Nearest); //この場合は補完しない - Game.Gl.TexParameterI(GLEnum.Texture2D, GLEnum.TextureMagFilter, (int)TextureMinFilter.Nearest); - //------ - - Game.Gl.BindTexture(TextureTarget.Texture2D, 0); //バインドを解除することを忘れないように - - return handle; - } - - public void MakeTexture(SKBitmap bitmap, bool b黒を透過する) - { - try - { - if (bitmap == null) - { - bitmap = new SKBitmap(10, 10); - } - - unsafe - { - fixed (void* data = bitmap.Pixels) - { - if (Thread.CurrentThread.ManagedThreadId == Game.MainThreadID) - { - Texture_ = GenTexture(data, (uint)bitmap.Width, (uint)bitmap.Height, PixelFormat.Bgra); - } - else - { - SKBitmap bm = bitmap.Copy(); - Action createInstance = () => - { - fixed (void* data2 = bitmap.Pixels) - { - Texture_ = GenTexture(data2, (uint)bitmap.Width, (uint)bitmap.Height, PixelFormat.Bgra); - } - bm.Dispose(); - }; - Game.AsyncActions.Add(createInstance); - while (Game.AsyncActions.Contains(createInstance)) - { - - } - } - } - } - - this.sz画像サイズ = new Size(bitmap.Width, bitmap.Height); - this.rc全画像 = new Rectangle(0, 0, this.sz画像サイズ.Width, this.sz画像サイズ.Height); - this.szTextureSize = this.t指定されたサイズを超えない最適なテクスチャサイズを返す(this.sz画像サイズ); - } - catch - { - this.Dispose(); - // throw new CTextureCreateFailedException( string.Format( "テクスチャの生成に失敗しました。\n{0}", strファイル名 ) ); - throw new CTextureCreateFailedException(string.Format("テクスチャの生成に失敗しました。\n")); - } - } - - public void tSetScale(float x, float y) - { - vcScaleRatio.X = x; - vcScaleRatio.Y = y; - } - - // メソッド - - // 2016.11.10 kairera0467 拡張 - // Rectangleを使う場合、座標調整のためにテクスチャサイズの値をそのまま使うとまずいことになるため、Rectragleから幅を取得して調整をする。 - public void t2D中心基準描画(int x, int y) - { - this.t2D描画(x - (this.szTextureSize.Width / 2), y - (this.szTextureSize.Height / 2), 1f, this.rc全画像); - } - - public void t2D中心基準描画Mirrored(int x, int y) - { - this.t2D左右反転描画(x - (this.szTextureSize.Width / 2), y - (this.szTextureSize.Height / 2), 1f, this.rc全画像); - } - - public void t2D中心基準描画Mirrored(float x, float y) - { - this.t2D左右反転描画(x - (this.szTextureSize.Width / 2), y - (this.szTextureSize.Height / 2), 1f, this.rc全画像); - } - - public void t2D中心基準描画(int x, int y, Rectangle rc画像内の描画領域) - { - this.t2D描画(x - (rc画像内の描画領域.Width / 2), y - (rc画像内の描画領域.Height / 2), 1f, rc画像内の描画領域); - } - public void t2D中心基準描画(float x, float y) - { - this.t2D描画((int)x - (this.szTextureSize.Width / 2), (int)y - (this.szTextureSize.Height / 2), 1f, this.rc全画像); - } - public void t2D中心基準描画(float x, float y, Rectangle rc画像内の描画領域) - { - this.t2D描画((int)x - (rc画像内の描画領域.Width / 2), (int)y - (rc画像内の描画領域.Height / 2), 1.0f, rc画像内の描画領域); - } - public void t2D中心基準描画(float x, float y, float depth, Rectangle rc画像内の描画領域) - { - this.t2D描画((int)x - (rc画像内の描画領域.Width / 2), (int)y - (rc画像内の描画領域.Height / 2), depth, rc画像内の描画領域); - } - - // 下を基準にして描画する(拡大率考慮)メソッドを追加。 (AioiLight) - public void t2D拡大率考慮下基準描画(int x, int y) - { - this.t2D描画(x, y - (szTextureSize.Height * this.vcScaleRatio.Y), 1f, this.rc全画像); - } - public void t2D拡大率考慮下基準描画(int x, int y, Rectangle rc画像内の描画領域) - { - this.t2D描画(x, y - (rc画像内の描画領域.Height * this.vcScaleRatio.Y), 1f, rc画像内の描画領域); - } - public void t2D拡大率考慮下中心基準描画(int x, int y) - { - this.t2D描画(x - (this.szTextureSize.Width / 2 * this.vcScaleRatio.X), y - (szTextureSize.Height * this.vcScaleRatio.Y), 1f, this.rc全画像); - } - - public void t2D拡大率考慮下中心基準描画Mirrored(int x, int y) - { - this.t2D左右反転描画(x - (this.szTextureSize.Width / 2 * this.vcScaleRatio.X), y - (szTextureSize.Height * this.vcScaleRatio.Y), 1f, this.rc全画像); - } - public void t2D拡大率考慮下中心基準描画Mirrored(float x, float y) - { - this.t2D左右反転描画(x - (this.szTextureSize.Width / 2 * this.vcScaleRatio.X), y - (szTextureSize.Height * this.vcScaleRatio.Y), 1f, this.rc全画像); - } - - public void t2D拡大率考慮下基準描画(float x, float y) - { - this.t2D描画(x, y - (szTextureSize.Height * this.vcScaleRatio.Y), 1f, this.rc全画像); - } - public void t2D拡大率考慮下基準描画(float x, float y, RectangleF rc画像内の描画領域) - { - this.t2D描画(x, y - (rc画像内の描画領域.Height * this.vcScaleRatio.Y), 1f, rc画像内の描画領域); - } - public void t2D拡大率考慮下中心基準描画(float x, float y) - { - this.t2D拡大率考慮下中心基準描画((int)x, (int)y); - } - - public void t2D拡大率考慮下中心基準描画(int x, int y, Rectangle rc画像内の描画領域) - { - this.t2D描画(x - ((rc画像内の描画領域.Width / 2)), y - (rc画像内の描画領域.Height * this.vcScaleRatio.Y), 1f, rc画像内の描画領域); - } - public void t2D拡大率考慮下中心基準描画(float x, float y, Rectangle rc画像内の描画領域) - { - this.t2D拡大率考慮下中心基準描画((int)x, (int)y, rc画像内の描画領域); - } - public void t2D下中央基準描画(int x, int y) - { - this.t2D描画(x - (this.szTextureSize.Width / 2), y - (szTextureSize.Height), this.rc全画像); - } - public void t2D下中央基準描画(int x, int y, Rectangle rc画像内の描画領域) - { - this.t2D描画(x - (rc画像内の描画領域.Width / 2), y - (rc画像内の描画領域.Height), rc画像内の描画領域); - //this.t2D描画(devicek x, y, rc画像内の描画領域; - } - - public void t2D_DisplayImage_RollNote(int x, int y, RectangleF rc) - { - this.t2D描画(x - (rc.Width / 2 * this.vcScaleRatio.X), y - (rc.Height / 2 * this.vcScaleRatio.Y), 1f, rc, true); - } - - public void t2D拡大率考慮中央基準描画(int x, int y) - { - this.t2D描画(x - (this.szTextureSize.Width / 2 * this.vcScaleRatio.X), y - (szTextureSize.Height / 2 * this.vcScaleRatio.Y), 1f, this.rc全画像); - } - public void t2D拡大率考慮中央基準描画(int x, int y, RectangleF rc) - { - this.t2D描画(x - (rc.Width / 2 * this.vcScaleRatio.X), y - (rc.Height / 2 * this.vcScaleRatio.Y), 1f, rc); - } - public void t2D_DisplayImage_AnchorCenterLeft(int x, int y, RectangleF rc) - { - this.t2D描画(x, y - (rc.Height / 2 * this.vcScaleRatio.Y), 1f, rc); - } - public void t2D拡大率考慮上中央基準描画(int x, int y, RectangleF rc) - { - this.t2D描画(x - (rc.Width / 2 * this.vcScaleRatio.X), y, 1f, rc); - } - public void t2D_DisplayImage_AnchorUpRight(int x, int y, RectangleF rc) - { - this.t2D描画(x - (rc.Width * this.vcScaleRatio.X), y, 1f, rc); - } - public void t2D拡大率考慮上中央基準描画(int x, int y) - { - this.t2D描画(x - (rc全画像.Width / 2 * this.vcScaleRatio.X), y, 1f, rc全画像); - } - public void t2D拡大率考慮中央基準描画(float x, float y) - { - this.t2D描画(x - (this.szTextureSize.Width / 2 * this.vcScaleRatio.X), y - (szTextureSize.Height / 2 * this.vcScaleRatio.Y), 1f, this.rc全画像); - } - public void t2D拡大率考慮中央基準描画Mirrored(float x, float y) - { - this.t2D左右反転描画(x - (this.szTextureSize.Width / 2 * this.vcScaleRatio.X), y - (szTextureSize.Height / 2 * this.vcScaleRatio.Y), 1f, this.rc全画像); - } - public void t2D拡大率考慮中央基準描画(float x, float y, RectangleF rc) - { - this.t2D描画(x - (rc.Width / 2 * this.vcScaleRatio.X), y - (rc.Height / 2 * this.vcScaleRatio.Y), 1f, rc); - } - public void t2D拡大率考慮描画(RefPnt refpnt, float x, float y) - { - this.t2D拡大率考慮描画(refpnt, x, y, rc全画像); - } - public void t2D拡大率考慮描画(RefPnt refpnt, float x, float y, Rectangle rect) - { - this.t2D拡大率考慮描画(refpnt, x, y, 1f, rect); - } - public void t2D拡大率考慮描画(RefPnt refpnt, float x, float y, float depth, Rectangle rect) - { - switch (refpnt) - { - case RefPnt.UpLeft: - this.t2D描画(x, y, depth, rect); - break; - case RefPnt.Up: - this.t2D描画(x - (rect.Width / 2 * this.vcScaleRatio.X), y, depth, rect); - break; - case RefPnt.UpRight: - this.t2D描画(x - rect.Width * this.vcScaleRatio.X, y, depth, rect); - break; - case RefPnt.Left: - this.t2D描画(x, y - (rect.Height / 2 * this.vcScaleRatio.Y), depth, rect); - break; - case RefPnt.Center: - this.t2D描画(x - (rect.Width / 2 * this.vcScaleRatio.X), y - (rect.Height / 2 * this.vcScaleRatio.Y), depth, rect); - break; - case RefPnt.Right: - this.t2D描画(x - rect.Width * this.vcScaleRatio.X, y - (rect.Height / 2 * this.vcScaleRatio.Y), depth, rect); - break; - case RefPnt.DownLeft: - this.t2D描画(x, y - rect.Height * this.vcScaleRatio.Y, depth, rect); - break; - case RefPnt.Down: - this.t2D描画(x - (rect.Width / 2 * this.vcScaleRatio.X), y - rect.Height * this.vcScaleRatio.Y, depth, rect); - break; - case RefPnt.DownRight: - this.t2D描画(x - rect.Width * this.vcScaleRatio.X, y - rect.Height * this.vcScaleRatio.Y, depth, rect); - break; - default: - break; - } - - } - public void t2D_DisplayImage_AnchorCenter(int x, int y) - { - this.t2D描画(x - (this.rc全画像.Width / 2 * this.vcScaleRatio.X), y - (this.rc全画像.Height / 2 * this.vcScaleRatio.Y), 1f, this.rc全画像); - } - public void t2D_DisplayImage_AnchorCenter(int x, int y, Rectangle rc) - { - this.t2D描画(x - (rc.Width / 2 * this.vcScaleRatio.X), y - (rc.Height / 2 * this.vcScaleRatio.Y), 1f, rc); - } - public void t2D_DisplayImage_AnchorCenter(int x, int y, RectangleF rc) - { - this.t2D描画(x - (rc.Width / 2 * this.vcScaleRatio.X), y - (rc.Height / 2 * this.vcScaleRatio.Y), 1f, rc); - } - - public enum RefPnt - { - UpLeft, - Up, - UpRight, - Left, - Center, - Right, - DownLeft, - Down, - DownRight, - } - - public void t2D_DisplayImage(int x, int y) - { - this.t2D描画(x, y, 1f, this.rc全画像); - } - public void t2D_DisplayImage(int x, int y, Rectangle rc画像内の描画領域) - { - this.t2D描画(x, y, 1f, rc画像内の描画領域); - } - public void t2D_DisplayImage(int x, int y, RectangleF rc) - { - this.t2D描画(x, y, 1f, rc); - } - - /// - /// テクスチャを 2D 画像と見なして描画する。 - /// - /// Direct3D9 デバイス。 - /// 描画位置(テクスチャの左上位置の X 座標[dot])。 - /// 描画位置(テクスチャの左上位置の Y 座標[dot])。 - public void t2D描画(int x, int y) - { - this.t2D描画(x, y, 1f, this.rc全画像); - } - public void t2D描画(int x, int y, RectangleF rc画像内の描画領域) - { - this.t2D描画(x, y, 1f, rc画像内の描画領域); - } - public void t2D描画(float x, float y) - { - this.t2D描画((int)x, (int)y, 1f, this.rc全画像); - } - public void t2D描画(float x, float y, RectangleF rc画像内の描画領域) - { - this.t2D描画((int)x, (int)y, 1f, rc画像内の描画領域); - } - public void t2D描画(float x, float y, float depth, RectangleF rc画像内の描画領域, bool flipX = false, bool flipY = false, bool rollMode = false) - { - this.color4.Alpha = this._opacity / 255f; - - BlendType blendType; - if (b加算合成) - { - blendType = BlendType.Add; - } - else if (b乗算合成) - { - blendType = BlendType.Multi; - } - else if (b減算合成) - { - blendType = BlendType.Sub; - } - else if (bスクリーン合成) - { - blendType = BlendType.Screen; - } - else - { - blendType = BlendType.Normal; - } - - BlendHelper.SetBlend(blendType); - - Game.Gl.UseProgram(ShaderProgram);//Uniform4よりこれが先 - - Game.Gl.BindTexture(TextureTarget.Texture2D, Texture_); //テクスチャをバインド - - //MVPを設定---- - unsafe - { - Matrix4X4 mvp = Matrix4X4.Identity; - - float gameAspect = (float)GameWindowSize.Width / GameWindowSize.Height; - - - //スケーリング----- - mvp *= Matrix4X4.CreateScale(rc画像内の描画領域.Width / GameWindowSize.Width, rc画像内の描画領域.Height / GameWindowSize.Height, 1) * - Matrix4X4.CreateScale(flipX ? -vcScaleRatio.X : vcScaleRatio.X, flipY ? -vcScaleRatio.Y : vcScaleRatio.Y, 1.0f); - //----- - - //回転----- - mvp *= Matrix4X4.CreateScale(1.0f * gameAspect, 1.0f, 1.0f) * //ここでアスペクト比でスケーリングしないとおかしなことになる - Matrix4X4.CreateRotationZ(fZ軸中心回転) * - Matrix4X4.CreateScale(1.0f / gameAspect, 1.0f, 1.0f);//回転した後戻してあげる - //----- - - //移動---- - float offsetX = rc画像内の描画領域.Width * vcScaleRatio.X / GameWindowSize.Width; - float offsetY = rc画像内の描画領域.Height * vcScaleRatio.Y / GameWindowSize.Height; - mvp *= Matrix4X4.CreateTranslation(offsetX, -offsetY, 0.0f); - mvp *= Matrix4X4.CreateTranslation(-1.0f, 1.0f, 0); - mvp *= Matrix4X4.CreateTranslation(x / GameWindowSize.Width * 2, -y / GameWindowSize.Height * 2, 0.0f); - //----- - - Game.Gl.UniformMatrix4(MVPID, 1, false, (float*)&mvp); //MVPに値を設定 - Matrix4X4 camera = Game.Camera; - Game.Gl.UniformMatrix4(CameraID, 1, false, (float*)&camera); - } - //------ - - Game.Gl.Uniform4(ColorID, new System.Numerics.Vector4(color4.Red, color4.Green, color4.Blue, color4.Alpha)); //変色用のカラーを設定 - Game.Gl.Uniform2(ScaleID, new System.Numerics.Vector2(vcScaleRatio.X, vcScaleRatio.Y)); //変色用のカラーを設定 - - //テクスチャの切り抜きの座標と大きさを設定 - Game.Gl.Uniform4(TextureRectID, new System.Numerics.Vector4( - rc画像内の描画領域.X / rc全画像.Width, rc画像内の描画領域.Y / rc全画像.Height, //始まり - rc画像内の描画領域.Width / rc全画像.Width, rc画像内の描画領域.Height / rc全画像.Height)); //大きさ、終わりではない - - Game.Gl.Uniform1(NoteModeID, rollMode ? 1 : 0); - - //描画----- - Game.Gl.BindVertexArray(VAO); - unsafe - { - Game.Gl.DrawElements(PrimitiveType.Triangles, IndicesCount, DrawElementsType.UnsignedInt, (void*)0);//描画! - } - - BlendHelper.SetBlend(BlendType.Normal); - } - public void t2D描画(int x, int y, float depth, Rectangle rc画像内の描画領域) - { - t2D描画((float)x, (float)y, depth, rc画像内の描画領域); - } - public void t2D上下反転描画(int x, int y) - { - this.t2D上下反転描画(x, y, 1f, this.rc全画像); - } - public void t2D上下反転描画(int x, int y, Rectangle rc画像内の描画領域) - { - this.t2D上下反転描画(x, y, 1f, rc画像内の描画領域); - } - public void t2D左右反転描画(int x, int y) - { - this.t2D左右反転描画(x, y, 1f, this.rc全画像); - } - public void t2D左右反転描画(float x, float y) - { - this.t2D左右反転描画(x, y, 1f, this.rc全画像); - } - public void t2D左右反転描画(int x, int y, Rectangle rc画像内の描画領域) - { - this.t2D左右反転描画(x, y, 1f, rc画像内の描画領域); - } - public void t2D左右反転描画(float x, float y, float depth, Rectangle rc画像内の描画領域) - { - t2D描画(x, y, depth, rc画像内の描画領域, flipX: true); - } - public void t2D上下反転描画(int x, int y, float depth, Rectangle rc画像内の描画領域) - { - t2D描画(x, y, depth, rc画像内の描画領域, flipY: true); - } - public void t2D上下反転描画(Point pt) - { - this.t2D上下反転描画(pt.X, pt.Y, 1f, this.rc全画像); - } - public void t2D上下反転描画(Point pt, Rectangle rc画像内の描画領域) - { - this.t2D上下反転描画(pt.X, pt.Y, 1f, rc画像内の描画領域); - } - public void t2D上下反転描画(Point pt, float depth, Rectangle rc画像内の描画領域) - { - this.t2D上下反転描画(pt.X, pt.Y, depth, rc画像内の描画領域); - } - - public static Vector3D t論理画面座標をワールド座標へ変換する(int x, int y) - { - return CTexture.t論理画面座標をワールド座標へ変換する(new Vector3D((float)x, (float)y, 0f)); - } - public static Vector3D t論理画面座標をワールド座標へ変換する(float x, float y) - { - return CTexture.t論理画面座標をワールド座標へ変換する(new Vector3D(x, y, 0f)); - } - public static Vector3D t論理画面座標をワールド座標へ変換する(Point pt論理画面座標) - { - return CTexture.t論理画面座標をワールド座標へ変換する(new Vector3D(pt論理画面座標.X, pt論理画面座標.Y, 0.0f)); - } - public static Vector3D t論理画面座標をワールド座標へ変換する(Vector2D v2論理画面座標) - { - return CTexture.t論理画面座標をワールド座標へ変換する(new Vector3D(v2論理画面座標, 0f)); - } - public static Vector3D t論理画面座標をワールド座標へ変換する(Vector3D v3論理画面座標) - { - return new Vector3D( - (v3論理画面座標.X - (CTexture.sz論理画面.Width / 2.0f)) * CTexture.f画面比率, - (-(v3論理画面座標.Y - (CTexture.sz論理画面.Height / 2.0f)) * CTexture.f画面比率), - v3論理画面座標.Z); - } - - - - - public void t2D描画SongObj(float x, float y, float xScale, float yScale) - { - this.color4.Alpha = this._opacity / 255f; - - var rc画像内の描画領域 = rc全画像; - this.color4.Alpha = this._opacity / 255f; - - BlendType blendType; - if (b加算合成) - { - blendType = BlendType.Add; - } - else if (b乗算合成) - { - blendType = BlendType.Multi; - } - else if (b減算合成) - { - blendType = BlendType.Sub; - } - else if (bスクリーン合成) - { - blendType = BlendType.Screen; - } - else - { - blendType = BlendType.Normal; - } - - BlendHelper.SetBlend(blendType); - - Game.Gl.UseProgram(ShaderProgram);//Uniform4よりこれが先 - - Game.Gl.BindTexture(TextureTarget.Texture2D, Texture_); //テクスチャをバインド - - //MVPを設定---- - unsafe - { - Matrix4X4 mvp = Matrix4X4.Identity; - - float gameAspect = (float)GameWindowSize.Width / GameWindowSize.Height; - - - //スケーリング----- - mvp *= Matrix4X4.CreateScale((float)rc画像内の描画領域.Width / GameWindowSize.Width, (float)rc画像内の描画領域.Height / GameWindowSize.Height, 1) * - Matrix4X4.CreateScale(xScale, yScale, 1.0f); - //----- - - //回転----- - mvp *= Matrix4X4.CreateScale(1.0f * gameAspect, 1.0f, 1.0f) * //ここでアスペクト比でスケーリングしないとおかしなことになる - Matrix4X4.CreateRotationZ(fZ軸中心回転) * - Matrix4X4.CreateScale(1.0f / gameAspect, 1.0f, 1.0f);//回転した後戻してあげる - //----- - - //移動---- - float offsetX = rc画像内の描画領域.Width * xScale / GameWindowSize.Width; - float offsetY = rc画像内の描画領域.Height * yScale / GameWindowSize.Height; - mvp *= Matrix4X4.CreateTranslation(offsetX, -offsetY, 0.0f); - mvp *= Matrix4X4.CreateTranslation(-1.0f, 1.0f, 0); - mvp *= Matrix4X4.CreateTranslation(x / GameWindowSize.Width * 2, -y / GameWindowSize.Height * 2, 0.0f); - //----- - - Game.Gl.UniformMatrix4(MVPID, 1, false, (float*)&mvp); //MVPに値を設定 - Matrix4X4 camera = Game.Camera; - Game.Gl.UniformMatrix4(CameraID, 1, false, (float*)&camera); - } - //------ - - Game.Gl.Uniform4(ColorID, new System.Numerics.Vector4(color4.Red, color4.Green, color4.Blue, color4.Alpha)); //変色用のカラーを設定 - Game.Gl.Uniform2(ScaleID, new System.Numerics.Vector2(vcScaleRatio.X, vcScaleRatio.Y)); //変色用のカラーを設定 - - //テクスチャの切り抜きの座標と大きさを設定 - Game.Gl.Uniform4(TextureRectID, new System.Numerics.Vector4( - rc画像内の描画領域.X / rc全画像.Width, rc画像内の描画領域.Y / rc全画像.Height, //始まり - rc画像内の描画領域.Width / rc全画像.Width, rc画像内の描画領域.Height / rc全画像.Height)); //大きさ、終わりではない - - Game.Gl.Uniform1(NoteModeID, 0); - - //描画----- - Game.Gl.BindVertexArray(VAO); - unsafe - { - Game.Gl.DrawElements(PrimitiveType.Triangles, IndicesCount, DrawElementsType.UnsignedInt, (void*)0);//描画! - } - - BlendHelper.SetBlend(BlendType.Normal); - } - - - #region [ IDisposable 実装 ] - //----------------- - public void Dispose() - { - if (!this.bDispose完了済み) - { - Game.Gl.DeleteTexture(Texture_); //解放 - - this.bDispose完了済み = true; - } - } - //----------------- - #endregion - - - // その他 - - #region [ private ] - //----------------- - private int _opacity; - private bool bDispose完了済み; - - private Size t指定されたサイズを超えない最適なテクスチャサイズを返す(Size sz指定サイズ) - { - return sz指定サイズ; - } - - private int ToArgb(Color4 col4) - { - uint a = (uint)(col4.Alpha * 255.0f) & 255; - uint r = (uint)(col4.Red * 255.0f) & 255; - uint g = (uint)(col4.Green * 255.0f) & 255; - uint b = (uint)(col4.Blue * 255.0f) & 255; - - uint value = b; - value |= g << 8; - value |= r << 16; - value |= a << 24; + 0, 1, 2, + 2, 1, 3 + }; + IndicesCount = (uint)indices.Length; //数を登録する + unsafe { + fixed (uint* data = indices) { + Game.Gl.BufferData(BufferTargetARB.ElementArrayBuffer, (nuint)(indices.Length * sizeof(uint)), data, BufferUsageARB.StaticDraw); //VRAMに送る + } + } + //----- + + //テクスチャの読み込みに使用するUV座標のバッファを作成、処理はVBOと大体同じ + UVBO = Game.Gl.GenBuffer(); + Game.Gl.BindBuffer(BufferTargetARB.ArrayBuffer, UVBO); + + float[] uvs = new float[] + { + 0.0f, 0.0f, + 1.0f, 0.0f, + 0.0f, 1.0f, + 1.0f, 1.0f, + }; + unsafe { + fixed (float* data = uvs) { + Game.Gl.BufferData(BufferTargetARB.ArrayBuffer, (nuint)(uvs.Length * sizeof(float)), data, BufferUsageARB.StaticDraw); + } + } + + uint locationUV = (uint)Game.Gl.GetAttribLocation(ShaderProgram, "aUV"); + Game.Gl.EnableVertexAttribArray(locationUV); + unsafe { + Game.Gl.VertexAttribPointer(locationUV, 2, VertexAttribPointerType.Float, false, 2 * sizeof(float), (void*)0); + } + //----- + + + //バインドを解除 厳密には必須ではないが何かのはずみでバインドされたままBufferSubDataでデータが更新されたらとかされたらまあ大変----- + Game.Gl.BindVertexArray(0); + Game.Gl.BindBuffer(BufferTargetARB.ArrayBuffer, 0); + Game.Gl.BindBuffer(BufferTargetARB.ElementArrayBuffer, 0); + //----- + + + } + + /// + /// 描画に使用する共通のバッファを解放 + /// + public static void Terminate() { + //ちゃんとバッファは解放すること + Game.Gl.DeleteVertexArray(VAO); + Game.Gl.DeleteBuffer(VBO); + Game.Gl.DeleteBuffer(EBO); + Game.Gl.DeleteBuffer(UVBO); + Game.Gl.DeleteProgram(ShaderProgram); + } + + // プロパティ + public bool b加算合成 { + get; + set; + } + public bool b乗算合成 { + get; + set; + } + public bool b減算合成 { + get; + set; + } + public bool bスクリーン合成 { + get; + set; + } + public float fZ軸中心回転 { + get; + set; + } + public float fZRotation { + get => fZ軸中心回転; + set { fZ軸中心回転 = value; } + } + public int Opacity { + get { + return this._opacity; + } + set { + if (value < 0) { + this._opacity = 0; + } else if (value > 0xff) { + this._opacity = 0xff; + } else { + this._opacity = value; + } + } + } + public Size szTextureSize { + get; + private set; + } + public Size sz画像サイズ { + get; + protected set; + } + public Vector3D vcScaleRatio; + + // 画面が変わるたび以下のプロパティを設定し治すこと。 + + public static Size sz論理画面 = Size.Empty; + public static Size sz物理画面 = Size.Empty; + public static Rectangle rc物理画面描画領域 = Rectangle.Empty; + /// + /// 論理画面を1とする場合の物理画面の倍率。 + /// 論理値×画面比率=物理値。 + /// + public static float f画面比率 = 1.0f; + + internal uint Texture_; + + // コンストラクタ + + public CTexture() { + this.sz画像サイズ = new Size(0, 0); + this.szTextureSize = new Size(0, 0); + this._opacity = 0xff; + this.b加算合成 = false; + this.fZ軸中心回転 = 0f; + this.vcScaleRatio = new Vector3D(1f, 1f, 1f); + // this._txData = null; + } + + public CTexture(CTexture tx) { + this.sz画像サイズ = tx.sz画像サイズ; + this.szTextureSize = tx.szTextureSize; + this._opacity = tx._opacity; + this.b加算合成 = tx.b加算合成; + this.fZ軸中心回転 = tx.fZ軸中心回転; + this.vcScaleRatio = tx.vcScaleRatio; + Texture_ = tx.Texture_; + // this._txData = null; + } + + public void UpdateTexture(CTexture texture, int n幅, int n高さ) { + Texture_ = texture.Texture_; + this.sz画像サイズ = new Size(n幅, n高さ); + this.szTextureSize = this.t指定されたサイズを超えない最適なテクスチャサイズを返す(this.sz画像サイズ); + this.rc全画像 = new Rectangle(0, 0, this.sz画像サイズ.Width, this.sz画像サイズ.Height); + } + + public void UpdateTexture(IntPtr texture, int width, int height, PixelFormat rgbaType) { + unsafe { + Game.Gl.DeleteTexture(Texture_); //解放 + void* data = texture.ToPointer(); + Texture_ = GenTexture(data, (uint)width, (uint)height, rgbaType); + } + this.sz画像サイズ = new Size(width, height); + this.szTextureSize = this.t指定されたサイズを超えない最適なテクスチャサイズを返す(this.sz画像サイズ); + this.rc全画像 = new Rectangle(0, 0, this.sz画像サイズ.Width, this.sz画像サイズ.Height); + } + + /// + /// 指定されたビットマップオブジェクトから Managed テクスチャを作成する。 + /// テクスチャのサイズは、BITMAP画像のサイズ以上、かつ、D3D9デバイスで生成可能な最小のサイズに自動的に調節される。 + /// その際、テクスチャの調節後のサイズにあわせた画像の拡大縮小は行わない。 + /// その他、ミップマップ数は 1、Usage は None、Pool は Managed、イメージフィルタは Point、ミップマップフィルタは + /// None、カラーキーは 0xFFFFFFFF(完全なる黒を透過)になる。 + /// + /// Direct3D9 デバイス。 + /// 作成元のビットマップ。 + /// テクスチャのフォーマット。 + /// テクスチャの作成に失敗しました。 + public CTexture(SKBitmap bitmap) + : this() { + try { + MakeTexture(bitmap, false); + } catch (Exception e) { + this.Dispose(); + throw new CTextureCreateFailedException("ビットマップからのテクスチャの生成に失敗しました。", e); + } + } + + public CTexture(int n幅, int n高さ) + : this() { + try { + this.sz画像サイズ = new Size(n幅, n高さ); + this.szTextureSize = this.t指定されたサイズを超えない最適なテクスチャサイズを返す(this.sz画像サイズ); + this.rc全画像 = new Rectangle(0, 0, this.sz画像サイズ.Width, this.sz画像サイズ.Height); + } catch { + this.Dispose(); + throw new CTextureCreateFailedException(string.Format("テクスチャの生成に失敗しました。\n({0}x{1}, {2})", n幅, n高さ)); + } + } + + /// + /// 画像ファイルからテクスチャを生成する。 + /// 利用可能な画像形式は、BMP, JPG, PNG, TGA, DDS, PPM, DIB, HDR, PFM のいずれか。 + /// テクスチャのサイズは、画像のサイズ以上、かつ、D3D9デバイスで生成可能な最小のサイズに自動的に調節される。 + /// その際、テクスチャの調節後のサイズにあわせた画像の拡大縮小は行わない。 + /// その他、ミップマップ数は 1、Usage は None、イメージフィルタは Point、ミップマップフィルタは None になる。 + /// + /// Direct3D9 デバイス。 + /// 画像ファイル名。 + /// テクスチャのフォーマット。 + /// 画像の黒(0xFFFFFFFF)を透過させるなら true。 + /// テクスチャの管理方法。 + /// テクスチャの作成に失敗しました。 + public CTexture(string strファイル名, bool b黒を透過する) + : this() { + MakeTexture(strファイル名, b黒を透過する); + } + public void MakeTexture(string strファイル名, bool b黒を透過する) { + if (!File.Exists(strファイル名)) // #27122 2012.1.13 from: ImageInformation では FileNotFound 例外は返ってこないので、ここで自分でチェックする。わかりやすいログのために。 + throw new FileNotFoundException(string.Format("ファイルが存在しません。\n[{0}]", strファイル名)); + + SKBitmap bitmap = SKBitmap.Decode(strファイル名); + MakeTexture(bitmap, b黒を透過する); + bitmap.Dispose(); + } + + public CTexture(SKBitmap bitmap, bool b黒を透過する) + : this() { + MakeTexture(bitmap, b黒を透過する); + } + + private unsafe uint GenTexture(void* data, uint width, uint height, PixelFormat pixelFormat) { + //テクスチャハンドルの作成----- + uint handle = Game.Gl.GenTexture(); + Game.Gl.BindTexture(TextureTarget.Texture2D, handle); + //----- + + //テクスチャのデータをVramに送る + Game.Gl.TexImage2D(TextureTarget.Texture2D, 0, (int)pixelFormat, width, height, 0, pixelFormat, GLEnum.UnsignedByte, data); + //----- + + //拡大縮小の時の補完を指定------ + Game.Gl.TexParameterI(GLEnum.Texture2D, GLEnum.TextureMinFilter, (int)TextureMinFilter.Nearest); //この場合は補完しない + Game.Gl.TexParameterI(GLEnum.Texture2D, GLEnum.TextureMagFilter, (int)TextureMinFilter.Nearest); + //------ + + Game.Gl.BindTexture(TextureTarget.Texture2D, 0); //バインドを解除することを忘れないように + + return handle; + } + + public void MakeTexture(SKBitmap bitmap, bool b黒を透過する) { + try { + if (bitmap == null) { + bitmap = new SKBitmap(10, 10); + } + + unsafe { + fixed (void* data = bitmap.Pixels) { + if (Thread.CurrentThread.ManagedThreadId == Game.MainThreadID) { + Texture_ = GenTexture(data, (uint)bitmap.Width, (uint)bitmap.Height, PixelFormat.Bgra); + } else { + SKBitmap bm = bitmap.Copy(); + Action createInstance = () => { + fixed (void* data2 = bitmap.Pixels) { + Texture_ = GenTexture(data2, (uint)bitmap.Width, (uint)bitmap.Height, PixelFormat.Bgra); + } + bm.Dispose(); + }; + Game.AsyncActions.Add(createInstance); + while (Game.AsyncActions.Contains(createInstance)) { + + } + } + } + } + + this.sz画像サイズ = new Size(bitmap.Width, bitmap.Height); + this.rc全画像 = new Rectangle(0, 0, this.sz画像サイズ.Width, this.sz画像サイズ.Height); + this.szTextureSize = this.t指定されたサイズを超えない最適なテクスチャサイズを返す(this.sz画像サイズ); + } catch { + this.Dispose(); + // throw new CTextureCreateFailedException( string.Format( "テクスチャの生成に失敗しました。\n{0}", strファイル名 ) ); + throw new CTextureCreateFailedException(string.Format("テクスチャの生成に失敗しました。\n")); + } + } + + public void tSetScale(float x, float y) { + vcScaleRatio.X = x; + vcScaleRatio.Y = y; + } + + // メソッド + + // 2016.11.10 kairera0467 拡張 + // Rectangleを使う場合、座標調整のためにテクスチャサイズの値をそのまま使うとまずいことになるため、Rectragleから幅を取得して調整をする。 + public void t2D中心基準描画(int x, int y) { + this.t2D描画(x - (this.szTextureSize.Width / 2), y - (this.szTextureSize.Height / 2), 1f, this.rc全画像); + } + + public void t2D中心基準描画Mirrored(int x, int y) { + this.t2D左右反転描画(x - (this.szTextureSize.Width / 2), y - (this.szTextureSize.Height / 2), 1f, this.rc全画像); + } + + public void t2D中心基準描画Mirrored(float x, float y) { + this.t2D左右反転描画(x - (this.szTextureSize.Width / 2), y - (this.szTextureSize.Height / 2), 1f, this.rc全画像); + } + + public void t2D中心基準描画(int x, int y, Rectangle rc画像内の描画領域) { + this.t2D描画(x - (rc画像内の描画領域.Width / 2), y - (rc画像内の描画領域.Height / 2), 1f, rc画像内の描画領域); + } + public void t2D中心基準描画(float x, float y) { + this.t2D描画((int)x - (this.szTextureSize.Width / 2), (int)y - (this.szTextureSize.Height / 2), 1f, this.rc全画像); + } + public void t2D中心基準描画(float x, float y, Rectangle rc画像内の描画領域) { + this.t2D描画((int)x - (rc画像内の描画領域.Width / 2), (int)y - (rc画像内の描画領域.Height / 2), 1.0f, rc画像内の描画領域); + } + public void t2D中心基準描画(float x, float y, float depth, Rectangle rc画像内の描画領域) { + this.t2D描画((int)x - (rc画像内の描画領域.Width / 2), (int)y - (rc画像内の描画領域.Height / 2), depth, rc画像内の描画領域); + } + + // 下を基準にして描画する(拡大率考慮)メソッドを追加。 (AioiLight) + public void t2D拡大率考慮下基準描画(int x, int y) { + this.t2D描画(x, y - (szTextureSize.Height * this.vcScaleRatio.Y), 1f, this.rc全画像); + } + public void t2D拡大率考慮下基準描画(int x, int y, Rectangle rc画像内の描画領域) { + this.t2D描画(x, y - (rc画像内の描画領域.Height * this.vcScaleRatio.Y), 1f, rc画像内の描画領域); + } + public void t2D拡大率考慮下中心基準描画(int x, int y) { + this.t2D描画(x - (this.szTextureSize.Width / 2 * this.vcScaleRatio.X), y - (szTextureSize.Height * this.vcScaleRatio.Y), 1f, this.rc全画像); + } + + public void t2D拡大率考慮下中心基準描画Mirrored(int x, int y) { + this.t2D左右反転描画(x - (this.szTextureSize.Width / 2 * this.vcScaleRatio.X), y - (szTextureSize.Height * this.vcScaleRatio.Y), 1f, this.rc全画像); + } + public void t2D拡大率考慮下中心基準描画Mirrored(float x, float y) { + this.t2D左右反転描画(x - (this.szTextureSize.Width / 2 * this.vcScaleRatio.X), y - (szTextureSize.Height * this.vcScaleRatio.Y), 1f, this.rc全画像); + } + + public void t2D拡大率考慮下基準描画(float x, float y) { + this.t2D描画(x, y - (szTextureSize.Height * this.vcScaleRatio.Y), 1f, this.rc全画像); + } + public void t2D拡大率考慮下基準描画(float x, float y, RectangleF rc画像内の描画領域) { + this.t2D描画(x, y - (rc画像内の描画領域.Height * this.vcScaleRatio.Y), 1f, rc画像内の描画領域); + } + public void t2D拡大率考慮下中心基準描画(float x, float y) { + this.t2D拡大率考慮下中心基準描画((int)x, (int)y); + } + + public void t2D拡大率考慮下中心基準描画(int x, int y, Rectangle rc画像内の描画領域) { + this.t2D描画(x - ((rc画像内の描画領域.Width / 2)), y - (rc画像内の描画領域.Height * this.vcScaleRatio.Y), 1f, rc画像内の描画領域); + } + public void t2D拡大率考慮下中心基準描画(float x, float y, Rectangle rc画像内の描画領域) { + this.t2D拡大率考慮下中心基準描画((int)x, (int)y, rc画像内の描画領域); + } + public void t2D下中央基準描画(int x, int y) { + this.t2D描画(x - (this.szTextureSize.Width / 2), y - (szTextureSize.Height), this.rc全画像); + } + public void t2D下中央基準描画(int x, int y, Rectangle rc画像内の描画領域) { + this.t2D描画(x - (rc画像内の描画領域.Width / 2), y - (rc画像内の描画領域.Height), rc画像内の描画領域); + //this.t2D描画(devicek x, y, rc画像内の描画領域; + } + + public void t2D_DisplayImage_RollNote(int x, int y, RectangleF rc) { + this.t2D描画(x - (rc.Width / 2 * this.vcScaleRatio.X), y - (rc.Height / 2 * this.vcScaleRatio.Y), 1f, rc, true); + } + + public void t2D拡大率考慮中央基準描画(int x, int y) { + this.t2D描画(x - (this.szTextureSize.Width / 2 * this.vcScaleRatio.X), y - (szTextureSize.Height / 2 * this.vcScaleRatio.Y), 1f, this.rc全画像); + } + public void t2D拡大率考慮中央基準描画(int x, int y, RectangleF rc) { + this.t2D描画(x - (rc.Width / 2 * this.vcScaleRatio.X), y - (rc.Height / 2 * this.vcScaleRatio.Y), 1f, rc); + } + public void t2D_DisplayImage_AnchorCenterLeft(int x, int y, RectangleF rc) { + this.t2D描画(x, y - (rc.Height / 2 * this.vcScaleRatio.Y), 1f, rc); + } + public void t2D拡大率考慮上中央基準描画(int x, int y, RectangleF rc) { + this.t2D描画(x - (rc.Width / 2 * this.vcScaleRatio.X), y, 1f, rc); + } + public void t2D_DisplayImage_AnchorUpRight(int x, int y, RectangleF rc) { + this.t2D描画(x - (rc.Width * this.vcScaleRatio.X), y, 1f, rc); + } + public void t2D拡大率考慮上中央基準描画(int x, int y) { + this.t2D描画(x - (rc全画像.Width / 2 * this.vcScaleRatio.X), y, 1f, rc全画像); + } + public void t2D拡大率考慮中央基準描画(float x, float y) { + this.t2D描画(x - (this.szTextureSize.Width / 2 * this.vcScaleRatio.X), y - (szTextureSize.Height / 2 * this.vcScaleRatio.Y), 1f, this.rc全画像); + } + public void t2D拡大率考慮中央基準描画Mirrored(float x, float y) { + this.t2D左右反転描画(x - (this.szTextureSize.Width / 2 * this.vcScaleRatio.X), y - (szTextureSize.Height / 2 * this.vcScaleRatio.Y), 1f, this.rc全画像); + } + public void t2D拡大率考慮中央基準描画(float x, float y, RectangleF rc) { + this.t2D描画(x - (rc.Width / 2 * this.vcScaleRatio.X), y - (rc.Height / 2 * this.vcScaleRatio.Y), 1f, rc); + } + public void t2D拡大率考慮描画(RefPnt refpnt, float x, float y) { + this.t2D拡大率考慮描画(refpnt, x, y, rc全画像); + } + public void t2D拡大率考慮描画(RefPnt refpnt, float x, float y, Rectangle rect) { + this.t2D拡大率考慮描画(refpnt, x, y, 1f, rect); + } + public void t2D拡大率考慮描画(RefPnt refpnt, float x, float y, float depth, Rectangle rect) { + switch (refpnt) { + case RefPnt.UpLeft: + this.t2D描画(x, y, depth, rect); + break; + case RefPnt.Up: + this.t2D描画(x - (rect.Width / 2 * this.vcScaleRatio.X), y, depth, rect); + break; + case RefPnt.UpRight: + this.t2D描画(x - rect.Width * this.vcScaleRatio.X, y, depth, rect); + break; + case RefPnt.Left: + this.t2D描画(x, y - (rect.Height / 2 * this.vcScaleRatio.Y), depth, rect); + break; + case RefPnt.Center: + this.t2D描画(x - (rect.Width / 2 * this.vcScaleRatio.X), y - (rect.Height / 2 * this.vcScaleRatio.Y), depth, rect); + break; + case RefPnt.Right: + this.t2D描画(x - rect.Width * this.vcScaleRatio.X, y - (rect.Height / 2 * this.vcScaleRatio.Y), depth, rect); + break; + case RefPnt.DownLeft: + this.t2D描画(x, y - rect.Height * this.vcScaleRatio.Y, depth, rect); + break; + case RefPnt.Down: + this.t2D描画(x - (rect.Width / 2 * this.vcScaleRatio.X), y - rect.Height * this.vcScaleRatio.Y, depth, rect); + break; + case RefPnt.DownRight: + this.t2D描画(x - rect.Width * this.vcScaleRatio.X, y - rect.Height * this.vcScaleRatio.Y, depth, rect); + break; + default: + break; + } + + } + public void t2D_DisplayImage_AnchorCenter(int x, int y) { + this.t2D描画(x - (this.rc全画像.Width / 2 * this.vcScaleRatio.X), y - (this.rc全画像.Height / 2 * this.vcScaleRatio.Y), 1f, this.rc全画像); + } + public void t2D_DisplayImage_AnchorCenter(int x, int y, Rectangle rc) { + this.t2D描画(x - (rc.Width / 2 * this.vcScaleRatio.X), y - (rc.Height / 2 * this.vcScaleRatio.Y), 1f, rc); + } + public void t2D_DisplayImage_AnchorCenter(int x, int y, RectangleF rc) { + this.t2D描画(x - (rc.Width / 2 * this.vcScaleRatio.X), y - (rc.Height / 2 * this.vcScaleRatio.Y), 1f, rc); + } + + public enum RefPnt { + UpLeft, + Up, + UpRight, + Left, + Center, + Right, + DownLeft, + Down, + DownRight, + } + + public void t2D_DisplayImage(int x, int y) { + this.t2D描画(x, y, 1f, this.rc全画像); + } + public void t2D_DisplayImage(int x, int y, Rectangle rc画像内の描画領域) { + this.t2D描画(x, y, 1f, rc画像内の描画領域); + } + public void t2D_DisplayImage(int x, int y, RectangleF rc) { + this.t2D描画(x, y, 1f, rc); + } + + /// + /// テクスチャを 2D 画像と見なして描画する。 + /// + /// Direct3D9 デバイス。 + /// 描画位置(テクスチャの左上位置の X 座標[dot])。 + /// 描画位置(テクスチャの左上位置の Y 座標[dot])。 + public void t2D描画(int x, int y) { + this.t2D描画(x, y, 1f, this.rc全画像); + } + public void t2D描画(int x, int y, RectangleF rc画像内の描画領域) { + this.t2D描画(x, y, 1f, rc画像内の描画領域); + } + public void t2D描画(float x, float y) { + this.t2D描画((int)x, (int)y, 1f, this.rc全画像); + } + public void t2D描画(float x, float y, RectangleF rc画像内の描画領域) { + this.t2D描画((int)x, (int)y, 1f, rc画像内の描画領域); + } + public void t2D描画(float x, float y, float depth, RectangleF rc画像内の描画領域, bool flipX = false, bool flipY = false, bool rollMode = false) { + this.color4.Alpha = this._opacity / 255f; + + BlendType blendType; + if (b加算合成) { + blendType = BlendType.Add; + } else if (b乗算合成) { + blendType = BlendType.Multi; + } else if (b減算合成) { + blendType = BlendType.Sub; + } else if (bスクリーン合成) { + blendType = BlendType.Screen; + } else { + blendType = BlendType.Normal; + } + + BlendHelper.SetBlend(blendType); + + Game.Gl.UseProgram(ShaderProgram);//Uniform4よりこれが先 + + Game.Gl.BindTexture(TextureTarget.Texture2D, Texture_); //テクスチャをバインド + + //MVPを設定---- + unsafe { + Matrix4X4 mvp = Matrix4X4.Identity; + + float gameAspect = (float)GameWindowSize.Width / GameWindowSize.Height; + + + //スケーリング----- + mvp *= Matrix4X4.CreateScale(rc画像内の描画領域.Width / GameWindowSize.Width, rc画像内の描画領域.Height / GameWindowSize.Height, 1) * + Matrix4X4.CreateScale(flipX ? -vcScaleRatio.X : vcScaleRatio.X, flipY ? -vcScaleRatio.Y : vcScaleRatio.Y, 1.0f); + //----- + + //回転----- + mvp *= Matrix4X4.CreateScale(1.0f * gameAspect, 1.0f, 1.0f) * //ここでアスペクト比でスケーリングしないとおかしなことになる + Matrix4X4.CreateRotationZ(fZ軸中心回転) * + Matrix4X4.CreateScale(1.0f / gameAspect, 1.0f, 1.0f);//回転した後戻してあげる + //----- + + //移動---- + float offsetX = rc画像内の描画領域.Width * vcScaleRatio.X / GameWindowSize.Width; + float offsetY = rc画像内の描画領域.Height * vcScaleRatio.Y / GameWindowSize.Height; + mvp *= Matrix4X4.CreateTranslation(offsetX, -offsetY, 0.0f); + mvp *= Matrix4X4.CreateTranslation(-1.0f, 1.0f, 0); + mvp *= Matrix4X4.CreateTranslation(x / GameWindowSize.Width * 2, -y / GameWindowSize.Height * 2, 0.0f); + //----- + + Game.Gl.UniformMatrix4(MVPID, 1, false, (float*)&mvp); //MVPに値を設定 + Matrix4X4 camera = Game.Camera; + Game.Gl.UniformMatrix4(CameraID, 1, false, (float*)&camera); + } + //------ + + Game.Gl.Uniform4(ColorID, new System.Numerics.Vector4(color4.Red, color4.Green, color4.Blue, color4.Alpha)); //変色用のカラーを設定 + Game.Gl.Uniform2(ScaleID, new System.Numerics.Vector2(vcScaleRatio.X, vcScaleRatio.Y)); //変色用のカラーを設定 + + //テクスチャの切り抜きの座標と大きさを設定 + Game.Gl.Uniform4(TextureRectID, new System.Numerics.Vector4( + rc画像内の描画領域.X / rc全画像.Width, rc画像内の描画領域.Y / rc全画像.Height, //始まり + rc画像内の描画領域.Width / rc全画像.Width, rc画像内の描画領域.Height / rc全画像.Height)); //大きさ、終わりではない + + Game.Gl.Uniform1(NoteModeID, rollMode ? 1 : 0); + + //描画----- + Game.Gl.BindVertexArray(VAO); + unsafe { + Game.Gl.DrawElements(PrimitiveType.Triangles, IndicesCount, DrawElementsType.UnsignedInt, (void*)0);//描画! + } + + BlendHelper.SetBlend(BlendType.Normal); + } + public void t2D描画(int x, int y, float depth, Rectangle rc画像内の描画領域) { + t2D描画((float)x, (float)y, depth, rc画像内の描画領域); + } + public void t2D上下反転描画(int x, int y) { + this.t2D上下反転描画(x, y, 1f, this.rc全画像); + } + public void t2D上下反転描画(int x, int y, Rectangle rc画像内の描画領域) { + this.t2D上下反転描画(x, y, 1f, rc画像内の描画領域); + } + public void t2D左右反転描画(int x, int y) { + this.t2D左右反転描画(x, y, 1f, this.rc全画像); + } + public void t2D左右反転描画(float x, float y) { + this.t2D左右反転描画(x, y, 1f, this.rc全画像); + } + public void t2D左右反転描画(int x, int y, Rectangle rc画像内の描画領域) { + this.t2D左右反転描画(x, y, 1f, rc画像内の描画領域); + } + public void t2D左右反転描画(float x, float y, float depth, Rectangle rc画像内の描画領域) { + t2D描画(x, y, depth, rc画像内の描画領域, flipX: true); + } + public void t2D上下反転描画(int x, int y, float depth, Rectangle rc画像内の描画領域) { + t2D描画(x, y, depth, rc画像内の描画領域, flipY: true); + } + public void t2D上下反転描画(Point pt) { + this.t2D上下反転描画(pt.X, pt.Y, 1f, this.rc全画像); + } + public void t2D上下反転描画(Point pt, Rectangle rc画像内の描画領域) { + this.t2D上下反転描画(pt.X, pt.Y, 1f, rc画像内の描画領域); + } + public void t2D上下反転描画(Point pt, float depth, Rectangle rc画像内の描画領域) { + this.t2D上下反転描画(pt.X, pt.Y, depth, rc画像内の描画領域); + } + + public static Vector3D t論理画面座標をワールド座標へ変換する(int x, int y) { + return CTexture.t論理画面座標をワールド座標へ変換する(new Vector3D((float)x, (float)y, 0f)); + } + public static Vector3D t論理画面座標をワールド座標へ変換する(float x, float y) { + return CTexture.t論理画面座標をワールド座標へ変換する(new Vector3D(x, y, 0f)); + } + public static Vector3D t論理画面座標をワールド座標へ変換する(Point pt論理画面座標) { + return CTexture.t論理画面座標をワールド座標へ変換する(new Vector3D(pt論理画面座標.X, pt論理画面座標.Y, 0.0f)); + } + public static Vector3D t論理画面座標をワールド座標へ変換する(Vector2D v2論理画面座標) { + return CTexture.t論理画面座標をワールド座標へ変換する(new Vector3D(v2論理画面座標, 0f)); + } + public static Vector3D t論理画面座標をワールド座標へ変換する(Vector3D v3論理画面座標) { + return new Vector3D( + (v3論理画面座標.X - (CTexture.sz論理画面.Width / 2.0f)) * CTexture.f画面比率, + (-(v3論理画面座標.Y - (CTexture.sz論理画面.Height / 2.0f)) * CTexture.f画面比率), + v3論理画面座標.Z); + } + + + + + public void t2D描画SongObj(float x, float y, float xScale, float yScale) { + this.color4.Alpha = this._opacity / 255f; + + var rc画像内の描画領域 = rc全画像; + this.color4.Alpha = this._opacity / 255f; + + BlendType blendType; + if (b加算合成) { + blendType = BlendType.Add; + } else if (b乗算合成) { + blendType = BlendType.Multi; + } else if (b減算合成) { + blendType = BlendType.Sub; + } else if (bスクリーン合成) { + blendType = BlendType.Screen; + } else { + blendType = BlendType.Normal; + } + + BlendHelper.SetBlend(blendType); + + Game.Gl.UseProgram(ShaderProgram);//Uniform4よりこれが先 + + Game.Gl.BindTexture(TextureTarget.Texture2D, Texture_); //テクスチャをバインド + + //MVPを設定---- + unsafe { + Matrix4X4 mvp = Matrix4X4.Identity; + + float gameAspect = (float)GameWindowSize.Width / GameWindowSize.Height; + + + //スケーリング----- + mvp *= Matrix4X4.CreateScale((float)rc画像内の描画領域.Width / GameWindowSize.Width, (float)rc画像内の描画領域.Height / GameWindowSize.Height, 1) * + Matrix4X4.CreateScale(xScale, yScale, 1.0f); + //----- + + //回転----- + mvp *= Matrix4X4.CreateScale(1.0f * gameAspect, 1.0f, 1.0f) * //ここでアスペクト比でスケーリングしないとおかしなことになる + Matrix4X4.CreateRotationZ(fZ軸中心回転) * + Matrix4X4.CreateScale(1.0f / gameAspect, 1.0f, 1.0f);//回転した後戻してあげる + //----- + + //移動---- + float offsetX = rc画像内の描画領域.Width * xScale / GameWindowSize.Width; + float offsetY = rc画像内の描画領域.Height * yScale / GameWindowSize.Height; + mvp *= Matrix4X4.CreateTranslation(offsetX, -offsetY, 0.0f); + mvp *= Matrix4X4.CreateTranslation(-1.0f, 1.0f, 0); + mvp *= Matrix4X4.CreateTranslation(x / GameWindowSize.Width * 2, -y / GameWindowSize.Height * 2, 0.0f); + //----- + + Game.Gl.UniformMatrix4(MVPID, 1, false, (float*)&mvp); //MVPに値を設定 + Matrix4X4 camera = Game.Camera; + Game.Gl.UniformMatrix4(CameraID, 1, false, (float*)&camera); + } + //------ + + Game.Gl.Uniform4(ColorID, new System.Numerics.Vector4(color4.Red, color4.Green, color4.Blue, color4.Alpha)); //変色用のカラーを設定 + Game.Gl.Uniform2(ScaleID, new System.Numerics.Vector2(vcScaleRatio.X, vcScaleRatio.Y)); //変色用のカラーを設定 + + //テクスチャの切り抜きの座標と大きさを設定 + Game.Gl.Uniform4(TextureRectID, new System.Numerics.Vector4( + rc画像内の描画領域.X / rc全画像.Width, rc画像内の描画領域.Y / rc全画像.Height, //始まり + rc画像内の描画領域.Width / rc全画像.Width, rc画像内の描画領域.Height / rc全画像.Height)); //大きさ、終わりではない + + Game.Gl.Uniform1(NoteModeID, 0); + + //描画----- + Game.Gl.BindVertexArray(VAO); + unsafe { + Game.Gl.DrawElements(PrimitiveType.Triangles, IndicesCount, DrawElementsType.UnsignedInt, (void*)0);//描画! + } + + BlendHelper.SetBlend(BlendType.Normal); + } + + + #region [ IDisposable 実装 ] + //----------------- + public void Dispose() { + if (!this.bDispose完了済み) { + Game.Gl.DeleteTexture(Texture_); //解放 + + this.bDispose完了済み = true; + } + } + //----------------- + #endregion - return (int)value; - } - - // 2012.3.21 さらなる new の省略作戦 - - protected Rectangle rc全画像; // テクスチャ作ったらあとは不変 - public Color4 color4 = new Color4(1f, 1f, 1f, 1f); // アルファ以外は不変 - - public void tUpdateColor4(Color4 c4) - { - this.color4 = c4; - } - - public void tUpdateOpacity(int o) - { - this.Opacity = o; - } - //----------------- - #endregion - } + // その他 + + #region [ private ] + //----------------- + private int _opacity; + private bool bDispose完了済み; + + private Size t指定されたサイズを超えない最適なテクスチャサイズを返す(Size sz指定サイズ) { + return sz指定サイズ; + } + + private int ToArgb(Color4 col4) { + uint a = (uint)(col4.Alpha * 255.0f) & 255; + uint r = (uint)(col4.Red * 255.0f) & 255; + uint g = (uint)(col4.Green * 255.0f) & 255; + uint b = (uint)(col4.Blue * 255.0f) & 255; + + uint value = b; + value |= g << 8; + value |= r << 16; + value |= a << 24; + + return (int)value; + } + + + // 2012.3.21 さらなる new の省略作戦 + + protected Rectangle rc全画像; // テクスチャ作ったらあとは不変 + public Color4 color4 = new Color4(1f, 1f, 1f, 1f); // アルファ以外は不変 + + public void tUpdateColor4(Color4 c4) { + this.color4 = c4; + } + + public void tUpdateOpacity(int o) { + this.Opacity = o; + } + //----------------- + #endregion + } } diff --git a/OpenTaiko/src/Common/Program.cs b/OpenTaiko/src/Common/Program.cs index 6da677ae..7833c02f 100644 --- a/OpenTaiko/src/Common/Program.cs +++ b/OpenTaiko/src/Common/Program.cs @@ -1,6 +1,5 @@ using System.Diagnostics; using System.Globalization; -using System.Reflection; using System.Runtime.InteropServices; using System.Text; diff --git a/OpenTaiko/src/Common/SaveFile.cs b/OpenTaiko/src/Common/SaveFile.cs index 7f42bd1d..48b4d607 100644 --- a/OpenTaiko/src/Common/SaveFile.cs +++ b/OpenTaiko/src/Common/SaveFile.cs @@ -193,14 +193,14 @@ namespace TJAPlayer3 { [JsonProperty("titleType")] public int TitleType = 0; - [JsonIgnore] - public int TitleRarityInt = 1; + [JsonIgnore] + public int TitleRarityInt = 1; - [JsonIgnore] - public int TitleId = -1; + [JsonIgnore] + public int TitleId = -1; - [JsonProperty("puchiChara")] - public string PuchiChara = "0"; + [JsonProperty("puchiChara")] + public string PuchiChara = "0"; [JsonProperty("medals")] diff --git a/OpenTaiko/src/Common/TJAPlayer3.cs b/OpenTaiko/src/Common/TJAPlayer3.cs index 2a4cb129..ee3d7229 100644 --- a/OpenTaiko/src/Common/TJAPlayer3.cs +++ b/OpenTaiko/src/Common/TJAPlayer3.cs @@ -1,26 +1,17 @@ -using System; -using System.Collections.Generic; -using System.Globalization; -using System.Text; +using System.Diagnostics; using System.Drawing; -using System.Diagnostics; -using System.IO; -using System.Threading; +using System.Globalization; using System.Net.NetworkInformation; +using System.Reflection; +using System.Runtime.InteropServices; using System.Runtime.Serialization.Formatters.Binary; +using System.Text; +using DiscordRPC; using FDK; using SampleFramework; -using System.Reflection; -using System.Threading.Tasks; -using System.Linq; using Silk.NET.Maths; using SkiaSharp; -using DiscordRPC; - using Rectangle = System.Drawing.Rectangle; -using Point = System.Drawing.Point; -using Color = System.Drawing.Color; -using System.Runtime.InteropServices; namespace TJAPlayer3 { internal class TJAPlayer3 : Game { @@ -2028,8 +2019,7 @@ for (int i = 0; i < 3; i++) { if (r現在のステージ != null && r現在のステージ.eStageID != CStage.EStage.StartUp && TJAPlayer3.Tx.Network_Connection != null) { if (Math.Abs(SoundManager.PlayTimer.SystemTimeMs - this.前回のシステム時刻ms) > 10000) { this.前回のシステム時刻ms = SoundManager.PlayTimer.SystemTimeMs; - Task.Factory.StartNew(() => - { + Task.Factory.StartNew(() => { //IPv4 8.8.8.8にPingを送信する(timeout 5000ms) PingReply reply = new Ping().Send("8.8.8.8", 5000); this.bネットワークに接続中 = reply.Status == IPStatus.Success; diff --git a/OpenTaiko/src/Databases/DBSaves.cs b/OpenTaiko/src/Databases/DBSaves.cs index 60f13511..7fa241d0 100644 --- a/OpenTaiko/src/Databases/DBSaves.cs +++ b/OpenTaiko/src/Databases/DBSaves.cs @@ -142,25 +142,25 @@ namespace TJAPlayer3 { while (reader.Read()) { SaveFile sf = new SaveFile(); - sf.data.SaveId = (Int64)reader["SaveId"]; - sf.data.Name = (string)reader["PlayerName"]; - sf.data.Title = (string)reader["PlayerNameplateTitle"]; - sf.data.Dan = (string)reader["PlayerDanTitle"]; - sf.data.DanGold = Convert.ToBoolean((Int64)reader["PlayerDanGold"]); - sf.data.DanType = (int)(Int64)reader["PlayerDanType"]; - sf.data.TitleType = (int)(Int64)reader["PlayerNameplateType"]; - sf.data.PuchiChara = (string)reader["PlayerPuchichara"]; - sf.data.Character = (int)(Int64)reader["PlayerCharacter"]; - sf.data.CharacterName = (string)reader["PlayerCharacterName"]; - sf.data.Medals = (Int64)reader["CurrentMedals"]; - sf.data.TotalEarnedMedals = (Int64)reader["TotalEarnedMedals"]; - sf.data.TotalPlaycount = (int)(Int64)reader["TotalPlaycount"]; - sf.data.AIBattleModePlaycount = (int)(Int64)reader["AIBattleModePlaycount"]; - sf.data.AIBattleModeWins = (int)(Int64)reader["AIBattleModeWins"]; - sf.data.TitleRarityInt = (int)(Int64)reader["PlayerNameplateRarityInt"]; - sf.data.TitleId = (int)(Int64)reader["PlayerNameplateId"]; - sf.tInitSaveFile(); - sf.tLoadUnlockables(); + sf.data.SaveId = (Int64)reader["SaveId"]; + sf.data.Name = (string)reader["PlayerName"]; + sf.data.Title = (string)reader["PlayerNameplateTitle"]; + sf.data.Dan = (string)reader["PlayerDanTitle"]; + sf.data.DanGold = Convert.ToBoolean((Int64)reader["PlayerDanGold"]); + sf.data.DanType = (int)(Int64)reader["PlayerDanType"]; + sf.data.TitleType = (int)(Int64)reader["PlayerNameplateType"]; + sf.data.PuchiChara = (string)reader["PlayerPuchichara"]; + sf.data.Character = (int)(Int64)reader["PlayerCharacter"]; + sf.data.CharacterName = (string)reader["PlayerCharacterName"]; + sf.data.Medals = (Int64)reader["CurrentMedals"]; + sf.data.TotalEarnedMedals = (Int64)reader["TotalEarnedMedals"]; + sf.data.TotalPlaycount = (int)(Int64)reader["TotalPlaycount"]; + sf.data.AIBattleModePlaycount = (int)(Int64)reader["AIBattleModePlaycount"]; + sf.data.AIBattleModeWins = (int)(Int64)reader["AIBattleModeWins"]; + sf.data.TitleRarityInt = (int)(Int64)reader["PlayerNameplateRarityInt"]; + sf.data.TitleId = (int)(Int64)reader["PlayerNameplateId"]; + sf.tInitSaveFile(); + sf.tLoadUnlockables(); _instances[_file] = sf; _file++; diff --git a/OpenTaiko/src/Items/CItemBase.cs b/OpenTaiko/src/Items/CItemBase.cs index 25f7cf0e..a5402fa1 100644 --- a/OpenTaiko/src/Items/CItemBase.cs +++ b/OpenTaiko/src/Items/CItemBase.cs @@ -23,28 +23,24 @@ namespace TJAPlayer3 { 切替リスト } - public string str項目名; - public string strName - { - get - { - return str項目名; + public string str項目名; + public string strName { + get { + return str項目名; - } - } + } + } - public string str説明文; - public string strDescription - { - get - { - return str説明文; + public string str説明文; + public string strDescription { + get { + return str説明文; - } - } + } + } - // コンストラクタ + // コンストラクタ public CItemBase() { this.str項目名 = ""; @@ -110,13 +106,11 @@ namespace TJAPlayer3 { return null; } - public string tGetValueText() - { - object value = obj現在値(); - return value == null ? "" : value.ToString(); - } - public virtual int GetIndex() - { + public string tGetValueText() { + object value = obj現在値(); + return value == null ? "" : value.ToString(); + } + public virtual int GetIndex() { return 0; } public virtual void SetIndex(int index) { diff --git a/OpenTaiko/src/Lua/CLuaScript.cs b/OpenTaiko/src/Lua/CLuaScript.cs index 6152da58..d1ac9023 100644 --- a/OpenTaiko/src/Lua/CLuaScript.cs +++ b/OpenTaiko/src/Lua/CLuaScript.cs @@ -1,271 +1,231 @@ -using System; -using System.Collections.Generic; -using System.Diagnostics; +using System.Diagnostics; using System.Drawing; -using System.Linq; using System.Text; -using System.Text.Json; using System.Text.Json.Nodes; -using System.Threading.Tasks; using FDK; using NLua; -using static KeraLua.LuaGC; -using Silk.NET.OpenGLES; -using SkiaSharp; -using TJAPlayer3; using static TJAPlayer3.CActSelect曲リスト; -namespace TJAPlayer3 -{ - class CLuaScript : IDisposable - { - private static List listScripts = new List(); - public static void tReloadLanguage(string lang) - { - foreach (var item in listScripts) - { - item.ReloadLanguage(lang); - } - } +namespace TJAPlayer3 { + class CLuaScript : IDisposable { + private static List listScripts = new List(); + public static void tReloadLanguage(string lang) { + foreach (var item in listScripts) { + item.ReloadLanguage(lang); + } + } - public string strDir { get; private set; } - public string strTexturesDir { get; private set; } - public string strSounsdDir { get; private set; } + public string strDir { get; private set; } + public string strTexturesDir { get; private set; } + public string strSounsdDir { get; private set; } - public bool bLoadedAssets { get; private set; } - public bool bDisposed { get; private set; } - public bool bCrashed { get; protected set; } + public bool bLoadedAssets { get; private set; } + public bool bDisposed { get; private set; } + public bool bCrashed { get; protected set; } - protected Lua LuaScript { get; private set; } + protected Lua LuaScript { get; private set; } - private LuaFunction lfLoadAssets; - private LuaFunction lfReloadLanguage; + private LuaFunction lfLoadAssets; + private LuaFunction lfReloadLanguage; - private CLuaInfo luaInfo; - private CLuaFps luaFPS = new CLuaFps(); + private CLuaInfo luaInfo; + private CLuaFps luaFPS = new CLuaFps(); - private List listDisposables = new List(); + private List listDisposables = new List(); - protected bool Avaibale - { - get - { - return bLoadedAssets && !bDisposed && !bCrashed; - } - } + protected bool Avaibale { + get { + return bLoadedAssets && !bDisposed && !bCrashed; + } + } - private double getNum(JsonValue x) - { - return (double)x; - } + private double getNum(JsonValue x) { + return (double)x; + } - private string getText(JsonValue x) - { - return (string)x; - } + private string getText(JsonValue x) { + return (string)x; + } - private List getNumArray(JsonArray x) - { - List array = new List(); + private List getNumArray(JsonArray x) { + List array = new List(); - foreach (double value in x) - { - array.Add(value); - } - return array; - } + foreach (double value in x) { + array.Add(value); + } + return array; + } - private List getTextArray(JsonArray x) - { - List array = new List(); + private List getTextArray(JsonArray x) { + List array = new List(); - foreach (string value in x) - { - array.Add(value); - } - return array; - } + foreach (string value in x) { + array.Add(value); + } + return array; + } - protected object[] RunLuaCode(LuaFunction luaFunction, params object[] args) - { - try - { - var ret = luaFunction.Call(args); + protected object[] RunLuaCode(LuaFunction luaFunction, params object[] args) { + try { + var ret = luaFunction.Call(args); LuaScript.State.GarbageCollector(KeraLua.LuaGC.Collect, 0); return ret; - } - catch (Exception exception) - { - Crash(exception); - } - return new object[0]; - } + } catch (Exception exception) { + Crash(exception); + } + return new object[0]; + } - private JsonNode LoadConfig(string name) - { - using Stream stream = File.OpenRead($"{strDir}/{name}"); - JsonNode jsonNode = JsonNode.Parse(stream); - return jsonNode; - } + private JsonNode LoadConfig(string name) { + using Stream stream = File.OpenRead($"{strDir}/{name}"); + JsonNode jsonNode = JsonNode.Parse(stream); + return jsonNode; + } - private CTexture LoadTexture(string name) - { - CTexture texture = new CTexture($"{strTexturesDir}/{name}", false); + private CTexture LoadTexture(string name) { + CTexture texture = new CTexture($"{strTexturesDir}/{name}", false); - listDisposables.Add(texture); - return texture; - } + listDisposables.Add(texture); + return texture; + } - private void DebugLog(string message) - { - Trace.TraceInformation(": " + message); - } + private void DebugLog(string message) { + Trace.TraceInformation(": " + message); + } - private CSound LoadSound(string name, string soundGroupName) - { - ESoundGroup soundGroup; - switch (soundGroupName) - { - case "soundeffect": - soundGroup = ESoundGroup.SoundEffect; - break; - case "voice": - soundGroup = ESoundGroup.Voice; - break; - case "songpreview": - soundGroup = ESoundGroup.SongPreview; - break; - case "songplayback": - soundGroup = ESoundGroup.SongPlayback; - break; - default: - soundGroup = ESoundGroup.Unknown; - break; - } - CSound sound = TJAPlayer3.SoundManager?.tCreateSound($"{strSounsdDir}/{name}", soundGroup); + private CSound LoadSound(string name, string soundGroupName) { + ESoundGroup soundGroup; + switch (soundGroupName) { + case "soundeffect": + soundGroup = ESoundGroup.SoundEffect; + break; + case "voice": + soundGroup = ESoundGroup.Voice; + break; + case "songpreview": + soundGroup = ESoundGroup.SongPreview; + break; + case "songplayback": + soundGroup = ESoundGroup.SongPlayback; + break; + default: + soundGroup = ESoundGroup.Unknown; + break; + } + CSound sound = TJAPlayer3.SoundManager?.tCreateSound($"{strSounsdDir}/{name}", soundGroup); - listDisposables.Add(sound); - return sound; - } + listDisposables.Add(sound); + return sound; + } - private CCachedFontRenderer LoadFontRenderer(int size, string fontStyleName) - { - CFontRenderer.FontStyle fontStyle; - switch (fontStyleName) - { - case "regular": - fontStyle = CFontRenderer.FontStyle.Regular; - break; - case "bold": - fontStyle = CFontRenderer.FontStyle.Bold; - break; - case "italic": - fontStyle = CFontRenderer.FontStyle.Italic; - break; - case "underline": - fontStyle = CFontRenderer.FontStyle.Underline; - break; - case "strikeout": - fontStyle = CFontRenderer.FontStyle.Strikeout; - break; - default: - fontStyle = CFontRenderer.FontStyle.Regular; - break; - } - CCachedFontRenderer fontRenderer = HPrivateFastFont.tInstantiateMainFont(size, fontStyle); + private CCachedFontRenderer LoadFontRenderer(int size, string fontStyleName) { + CFontRenderer.FontStyle fontStyle; + switch (fontStyleName) { + case "regular": + fontStyle = CFontRenderer.FontStyle.Regular; + break; + case "bold": + fontStyle = CFontRenderer.FontStyle.Bold; + break; + case "italic": + fontStyle = CFontRenderer.FontStyle.Italic; + break; + case "underline": + fontStyle = CFontRenderer.FontStyle.Underline; + break; + case "strikeout": + fontStyle = CFontRenderer.FontStyle.Strikeout; + break; + default: + fontStyle = CFontRenderer.FontStyle.Regular; + break; + } + CCachedFontRenderer fontRenderer = HPrivateFastFont.tInstantiateMainFont(size, fontStyle); - listDisposables.Add(fontRenderer); - return fontRenderer; - } + listDisposables.Add(fontRenderer); + return fontRenderer; + } - private TitleTextureKey CreateTitleTextureKey(string title, CCachedFontRenderer fontRenderer, int maxSize, Color? color = null, Color? edgeColor = null) - { - return new TitleTextureKey(title, fontRenderer, color ?? Color.White, edgeColor ?? Color.Black, maxSize); - } + private TitleTextureKey CreateTitleTextureKey(string title, CCachedFontRenderer fontRenderer, int maxSize, Color? color = null, Color? edgeColor = null) { + return new TitleTextureKey(title, fontRenderer, color ?? Color.White, edgeColor ?? Color.Black, maxSize); + } - private CTexture GetTextTex(CActSelect曲リスト.TitleTextureKey titleTextureKey, bool vertical, bool keepCenter) - { - return TJAPlayer3.stageSongSelect.actSongList.ResolveTitleTexture(titleTextureKey, vertical, keepCenter); - } + private CTexture GetTextTex(CActSelect曲リスト.TitleTextureKey titleTextureKey, bool vertical, bool keepCenter) { + return TJAPlayer3.stageSongSelect.actSongList.ResolveTitleTexture(titleTextureKey, vertical, keepCenter); + } - public CLuaScript(string dir, string? texturesDir = null, string? soundsDir = null, bool loadAssets = true) - { - strDir = dir; - strTexturesDir = texturesDir ?? $"{dir}/Textures"; - strSounsdDir = soundsDir ?? $"{dir}/Sounds"; + public CLuaScript(string dir, string? texturesDir = null, string? soundsDir = null, bool loadAssets = true) { + strDir = dir; + strTexturesDir = texturesDir ?? $"{dir}/Textures"; + strSounsdDir = soundsDir ?? $"{dir}/Sounds"; - LuaScript = new Lua(); - LuaScript.LoadCLRPackage(); - LuaScript.State.Encoding = Encoding.UTF8; - LuaScript.DoFile($"{strDir}/Script.lua"); + LuaScript = new Lua(); + LuaScript.LoadCLRPackage(); + LuaScript.State.Encoding = Encoding.UTF8; + LuaScript.DoFile($"{strDir}/Script.lua"); - LuaScript["info"] = luaInfo = new CLuaInfo(strDir); - LuaScript["fps"] = luaFPS; + LuaScript["info"] = luaInfo = new CLuaInfo(strDir); + LuaScript["fps"] = luaFPS; - lfLoadAssets = (LuaFunction)LuaScript["loadAssets"]; - lfReloadLanguage = (LuaFunction)LuaScript["reloadLanguage"]; + lfLoadAssets = (LuaFunction)LuaScript["loadAssets"]; + lfReloadLanguage = (LuaFunction)LuaScript["reloadLanguage"]; - LuaScript["loadConfig"] = LoadConfig; - LuaScript["loadTexture"] = LoadTexture; - LuaScript["loadSound"] = LoadSound; - LuaScript["loadFontRenderer"] = LoadFontRenderer; - LuaScript["createTitleTextureKey"] = CreateTitleTextureKey; - LuaScript["getTextTex"] = GetTextTex; - LuaScript["getNum"] = getNum; - LuaScript["getText"] = getText; - LuaScript["getNumArray"] = getNumArray; - LuaScript["getTextArray"] = getTextArray; - LuaScript["displayDanPlate"] = CActSelect段位リスト.tDisplayDanPlate; - LuaScript["debugLog"] = DebugLog; + LuaScript["loadConfig"] = LoadConfig; + LuaScript["loadTexture"] = LoadTexture; + LuaScript["loadSound"] = LoadSound; + LuaScript["loadFontRenderer"] = LoadFontRenderer; + LuaScript["createTitleTextureKey"] = CreateTitleTextureKey; + LuaScript["getTextTex"] = GetTextTex; + LuaScript["getNum"] = getNum; + LuaScript["getText"] = getText; + LuaScript["getNumArray"] = getNumArray; + LuaScript["getTextArray"] = getTextArray; + LuaScript["displayDanPlate"] = CActSelect段位リスト.tDisplayDanPlate; + LuaScript["debugLog"] = DebugLog; - if (loadAssets) LoadAssets(); + if (loadAssets) LoadAssets(); - listScripts.Add(this); - } + listScripts.Add(this); + } - public void LoadAssets(params object[] args) - { - if (bLoadedAssets) return; + public void LoadAssets(params object[] args) { + if (bLoadedAssets) return; - RunLuaCode(lfLoadAssets, args); + RunLuaCode(lfLoadAssets, args); - bLoadedAssets = true; - bDisposed = false; - } + bLoadedAssets = true; + bDisposed = false; + } - public void ReloadLanguage(params object[] args) - { - RunLuaCode(lfReloadLanguage, args); - } + public void ReloadLanguage(params object[] args) { + RunLuaCode(lfReloadLanguage, args); + } - public void Dispose() - { - if (bDisposed) return; + public void Dispose() { + if (bDisposed) return; - foreach (IDisposable disposable in listDisposables) - { - disposable.Dispose(); - } - listDisposables.Clear(); + foreach (IDisposable disposable in listDisposables) { + disposable.Dispose(); + } + listDisposables.Clear(); - LuaScript.Dispose(); + LuaScript.Dispose(); - bDisposed = true; - bLoadedAssets = false; + bDisposed = true; + bLoadedAssets = false; - listScripts.Remove(this); - } + listScripts.Remove(this); + } - private void Crash(Exception exception) - { - bCrashed = true; + private void Crash(Exception exception) { + bCrashed = true; - LogNotification.PopError($"Lua Script Error: {exception.ToString()}"); - } - } + LogNotification.PopError($"Lua Script Error: {exception.ToString()}"); + } + } } diff --git a/OpenTaiko/src/Lua/Infos/CLuaFps.cs b/OpenTaiko/src/Lua/Infos/CLuaFps.cs index 5a422df7..1c1e4ef7 100644 --- a/OpenTaiko/src/Lua/Infos/CLuaFps.cs +++ b/OpenTaiko/src/Lua/Infos/CLuaFps.cs @@ -1,14 +1,6 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace TJAPlayer3 -{ - internal class CLuaFps - { - public double deltaTime => TJAPlayer3.FPS.DeltaTime; - public int fps => TJAPlayer3.FPS.NowFPS; - } +namespace TJAPlayer3 { + internal class CLuaFps { + public double deltaTime => TJAPlayer3.FPS.DeltaTime; + public int fps => TJAPlayer3.FPS.NowFPS; + } } \ No newline at end of file diff --git a/OpenTaiko/src/Lua/Infos/CLuaInfo.cs b/OpenTaiko/src/Lua/Infos/CLuaInfo.cs index 9900b685..74348e93 100644 --- a/OpenTaiko/src/Lua/Infos/CLuaInfo.cs +++ b/OpenTaiko/src/Lua/Infos/CLuaInfo.cs @@ -1,24 +1,15 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; +namespace TJAPlayer3 { + internal class CLuaInfo { + public int playerCount => TJAPlayer3.ConfigIni.nPlayerCount; + public string lang => TJAPlayer3.ConfigIni.sLang; + public bool simplemode => TJAPlayer3.ConfigIni.SimpleMode; + public bool p1IsBlue => TJAPlayer3.P1IsBlue(); + public bool online => TJAPlayer3.app.bネットワークに接続中; -namespace TJAPlayer3 -{ - internal class CLuaInfo - { - public int playerCount => TJAPlayer3.ConfigIni.nPlayerCount; - public string lang => TJAPlayer3.ConfigIni.sLang; - public bool simplemode => TJAPlayer3.ConfigIni.SimpleMode; - public bool p1IsBlue => TJAPlayer3.P1IsBlue(); - public bool online => TJAPlayer3.app.bネットワークに接続中; + public string dir { get; init; } - public string dir { get; init; } - - public CLuaInfo(string dir) - { - this.dir = dir; - } - } + public CLuaInfo(string dir) { + this.dir = dir; + } + } } \ No newline at end of file diff --git a/OpenTaiko/src/Lua/Scripts/CLuaNamePlateScript.cs b/OpenTaiko/src/Lua/Scripts/CLuaNamePlateScript.cs index dfd15ab0..7a5a9179 100644 --- a/OpenTaiko/src/Lua/Scripts/CLuaNamePlateScript.cs +++ b/OpenTaiko/src/Lua/Scripts/CLuaNamePlateScript.cs @@ -1,72 +1,58 @@ using FDK; using NLua; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -namespace TJAPlayer3 -{ - internal class CLuaNamePlateScript : CLuaScript - { - private LuaFunction lfGetCharaOffset; - private LuaFunction lfSetInfos; - private LuaFunction lfDrawDan; - private LuaFunction lfDrawTitlePlate; - private LuaFunction lfUpdate; - private LuaFunction lfDraw; +namespace TJAPlayer3 { + internal class CLuaNamePlateScript : CLuaScript { + private LuaFunction lfGetCharaOffset; + private LuaFunction lfSetInfos; + private LuaFunction lfDrawDan; + private LuaFunction lfDrawTitlePlate; + private LuaFunction lfUpdate; + private LuaFunction lfDraw; - public CLuaNamePlateScript(string dir, string? texturesDir = null, string? soundsDir = null, bool loadAssets = true) : base(dir, texturesDir, soundsDir, loadAssets) - { - lfGetCharaOffset = (LuaFunction)LuaScript["getCharaOffset"]; - lfSetInfos = (LuaFunction)LuaScript["setInfos"]; - lfDrawDan = (LuaFunction)LuaScript["drawDan"]; - lfDrawTitlePlate = (LuaFunction)LuaScript["drawTitlePlate"]; - lfUpdate = (LuaFunction)LuaScript["update"]; - lfDraw = (LuaFunction)LuaScript["draw"]; - } + public CLuaNamePlateScript(string dir, string? texturesDir = null, string? soundsDir = null, bool loadAssets = true) : base(dir, texturesDir, soundsDir, loadAssets) { + lfGetCharaOffset = (LuaFunction)LuaScript["getCharaOffset"]; + lfSetInfos = (LuaFunction)LuaScript["setInfos"]; + lfDrawDan = (LuaFunction)LuaScript["drawDan"]; + lfDrawTitlePlate = (LuaFunction)LuaScript["drawTitlePlate"]; + lfUpdate = (LuaFunction)LuaScript["update"]; + lfDraw = (LuaFunction)LuaScript["draw"]; + } - public int GetCharaOffset() - { - if (!Avaibale) return 0; - double result = (double)RunLuaCode(lfGetCharaOffset)[0]; - return (int)result; - } + public int GetCharaOffset() { + if (!Avaibale) return 0; + double result = (double)RunLuaCode(lfGetCharaOffset)[0]; + return (int)result; + } - public void SetInfos(int player, string name, string title, string dan, SaveFile.Data data) - { - if (!Avaibale) return; + public void SetInfos(int player, string name, string title, string dan, SaveFile.Data data) { + if (!Avaibale) return; - RunLuaCode(lfSetInfos, player, name ?? "", title ?? "", dan ?? "", data); - } + RunLuaCode(lfSetInfos, player, name ?? "", title ?? "", dan ?? "", data); + } - public void DrawDan(int x, int y, int opacity, int danGrade, CTexture titleTex) - { - if (!Avaibale) return; + public void DrawDan(int x, int y, int opacity, int danGrade, CTexture titleTex) { + if (!Avaibale) return; - RunLuaCode(lfDrawDan, x, y, opacity, danGrade, titleTex); - } + RunLuaCode(lfDrawDan, x, y, opacity, danGrade, titleTex); + } - public void DrawTitlePlate(int x, int y, int opacity, int type, CTexture titleTex, int rarity, int nameplateId) - { - if (!Avaibale) return; + public void DrawTitlePlate(int x, int y, int opacity, int type, CTexture titleTex, int rarity, int nameplateId) { + if (!Avaibale) return; - RunLuaCode(lfDrawTitlePlate, x, y, opacity, type, titleTex, rarity, nameplateId); - } + RunLuaCode(lfDrawTitlePlate, x, y, opacity, type, titleTex, rarity, nameplateId); + } - public void Update(params object[] args) - { - if (!Avaibale) return; + public void Update(params object[] args) { + if (!Avaibale) return; - RunLuaCode(lfUpdate, args); - } + RunLuaCode(lfUpdate, args); + } - public void Draw(int x, int y, int opacity, int player, int side) - { - if (!Avaibale) return; + public void Draw(int x, int y, int opacity, int player, int side) { + if (!Avaibale) return; - RunLuaCode(lfDraw, x, y, opacity, player, side); - } - } + RunLuaCode(lfDraw, x, y, opacity, player, side); + } + } } \ No newline at end of file diff --git a/OpenTaiko/src/Stages/CNamePlate.cs b/OpenTaiko/src/Stages/CNamePlate.cs index c3edf52a..b9e8b9af 100644 --- a/OpenTaiko/src/Stages/CNamePlate.cs +++ b/OpenTaiko/src/Stages/CNamePlate.cs @@ -1,21 +1,8 @@ -using FDK; -using System; -using System.Collections.Generic; -using System.ComponentModel.Design; -using System.Drawing; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using static TJAPlayer3.CActSelect曲リスト; - -namespace TJAPlayer3 -{ - class CNamePlate - { - public CLuaNamePlateScript lcNamePlate { get; private set; } - public void RefleshSkin() - { - /* +namespace TJAPlayer3 { + class CNamePlate { + public CLuaNamePlateScript lcNamePlate { get; private set; } + public void RefleshSkin() { + /* for (int player = 0; player < 5; player++) { this.pfName[player]?.Dispose(); @@ -32,32 +19,29 @@ namespace TJAPlayer3 this.pfTitle = HPrivateFastFont.tInstantiateMainFont(TJAPlayer3.Skin.NamePlate_Font_Title_Size); this.pfdan = HPrivateFastFont.tInstantiateMainFont(TJAPlayer3.Skin.NamePlate_Font_Dan_Size); */ - lcNamePlate?.Dispose(); - lcNamePlate = new CLuaNamePlateScript(CSkin.Path("Modules/NamePlate")); + lcNamePlate?.Dispose(); + lcNamePlate = new CLuaNamePlateScript(CSkin.Path("Modules/NamePlate")); - for (int player = 0; player < 5; player++) - { - tNamePlateRefreshTitles(player); - } - } + for (int player = 0; player < 5; player++) { + tNamePlateRefreshTitles(player); + } + } - public CNamePlate() - { - for (int player = 0; player < 5; player++) - { - if (TJAPlayer3.SaveFileInstances[player].data.DanType < 0) TJAPlayer3.SaveFileInstances[player].data.DanType = 0; - else if (TJAPlayer3.SaveFileInstances[player].data.DanType > 2) TJAPlayer3.SaveFileInstances[player].data.DanType = 2; + public CNamePlate() { + for (int player = 0; player < 5; player++) { + if (TJAPlayer3.SaveFileInstances[player].data.DanType < 0) TJAPlayer3.SaveFileInstances[player].data.DanType = 0; + else if (TJAPlayer3.SaveFileInstances[player].data.DanType > 2) TJAPlayer3.SaveFileInstances[player].data.DanType = 2; - if (TJAPlayer3.SaveFileInstances[player].data.TitleType < 0) TJAPlayer3.SaveFileInstances[player].data.TitleType = 0; + if (TJAPlayer3.SaveFileInstances[player].data.TitleType < 0) TJAPlayer3.SaveFileInstances[player].data.TitleType = 0; - } - RefleshSkin(); + } + RefleshSkin(); - //ctNamePlateEffect = new CCounter(0, 120, 16.6f, TJAPlayer3.Timer); - //ctAnimatedNamePlateTitle = new CCounter(0, 10000, 60.0f, TJAPlayer3.Timer); - } + //ctNamePlateEffect = new CCounter(0, 120, 16.6f, TJAPlayer3.Timer); + //ctAnimatedNamePlateTitle = new CCounter(0, 10000, 60.0f, TJAPlayer3.Timer); + } - /* + /* public void tNamePlateDisplayNamePlateBase(int x, int y, int item) { int namePlateBaseX = TJAPlayer3.Tx.NamePlateBase.szTextureSize.Width; @@ -77,63 +61,57 @@ namespace TJAPlayer3 } */ - public void tNamePlateRefreshTitles(int player) - { - int actualPlayer = TJAPlayer3.GetActualPlayer(player); + public void tNamePlateRefreshTitles(int player) { + int actualPlayer = TJAPlayer3.GetActualPlayer(player); - string[] stages = { "初", "二", "三", "四", "五", "六", "七", "八", "九", "極" }; + string[] stages = { "初", "二", "三", "四", "五", "六", "七", "八", "九", "極" }; - string name; - string title; - string dan; + string name; + string title; + string dan; - bool isAI = TJAPlayer3.ConfigIni.bAIBattleMode && player == 1; - if (isAI) - { - name = CLangManager.LangInstance.GetString("AI_NAME"); - title = CLangManager.LangInstance.GetString("AI_TITLE"); - dan = stages[Math.Max(0, TJAPlayer3.ConfigIni.nAILevel - 1)] + "面"; - } - else - { - name = TJAPlayer3.SaveFileInstances[player].data.Name; - title = TJAPlayer3.SaveFileInstances[player].data.Title; - dan = TJAPlayer3.SaveFileInstances[player].data.Dan; - } - bIsPrevAI[player] = isAI; + bool isAI = TJAPlayer3.ConfigIni.bAIBattleMode && player == 1; + if (isAI) { + name = CLangManager.LangInstance.GetString("AI_NAME"); + title = CLangManager.LangInstance.GetString("AI_TITLE"); + dan = stages[Math.Max(0, TJAPlayer3.ConfigIni.nAILevel - 1)] + "面"; + } else { + name = TJAPlayer3.SaveFileInstances[player].data.Name; + title = TJAPlayer3.SaveFileInstances[player].data.Title; + dan = TJAPlayer3.SaveFileInstances[player].data.Dan; + } + bIsPrevAI[player] = isAI; - /* + /* txTitle[player] = TJAPlayer3.stageSongSelect.actSongList.ResolveTitleTexture(new TitleTextureKey(title, pfTitle, Color.Black, Color.Empty, 1000)); txName[player] = TJAPlayer3.stageSongSelect.actSongList.ResolveTitleTexture(new TitleTextureKey(name, pfName[player], Color.White, Color.Black, 1000)); if (TJAPlayer3.SaveFileInstances[player].data.DanGold) txdan[player] = TJAPlayer3.stageSongSelect.actSongList.ResolveTitleTexture(new TitleTextureKey($"{dan}", pfdan, Color.White, Color.Black, 1000)); else txdan[player] = TJAPlayer3.stageSongSelect.actSongList.ResolveTitleTexture(new TitleTextureKey(dan, pfdan, Color.White, Color.Black, 1000)); */ - if (TJAPlayer3.SaveFileInstances[player].data.DanGold) - lcNamePlate.SetInfos(player, name, title, $"{dan}", TJAPlayer3.SaveFileInstances[player].data); - else - lcNamePlate.SetInfos(player, name, title, dan, TJAPlayer3.SaveFileInstances[player].data); - } + if (TJAPlayer3.SaveFileInstances[player].data.DanGold) + lcNamePlate.SetInfos(player, name, title, $"{dan}", TJAPlayer3.SaveFileInstances[player].data); + else + lcNamePlate.SetInfos(player, name, title, dan, TJAPlayer3.SaveFileInstances[player].data); + } - public void tNamePlateDraw(int x, int y, int player, bool bTitle = false, int Opacity = 255) - { - float resolutionScaleX = TJAPlayer3.Skin.Resolution[0] / 1280.0f; - float resolutionScaleY = TJAPlayer3.Skin.Resolution[1] / 720.0f; + public void tNamePlateDraw(int x, int y, int player, bool bTitle = false, int Opacity = 255) { + float resolutionScaleX = TJAPlayer3.Skin.Resolution[0] / 1280.0f; + float resolutionScaleY = TJAPlayer3.Skin.Resolution[1] / 720.0f; - int basePlayer = player; - player = TJAPlayer3.GetActualPlayer(player); + int basePlayer = player; + player = TJAPlayer3.GetActualPlayer(player); - bool isAI = TJAPlayer3.ConfigIni.bAIBattleMode && basePlayer == 1; - if (bIsPrevAI[basePlayer] != isAI) - { - tNamePlateRefreshTitles(player); - } - bIsPrevAI[basePlayer] = isAI; + bool isAI = TJAPlayer3.ConfigIni.bAIBattleMode && basePlayer == 1; + if (bIsPrevAI[basePlayer] != isAI) { + tNamePlateRefreshTitles(player); + } + bIsPrevAI[basePlayer] = isAI; - lcNamePlate.Draw(x, y, Opacity, basePlayer, player); - } + lcNamePlate.Draw(x, y, Opacity, basePlayer, player); + } - private bool[] bIsPrevAI = new bool[5]; - } + private bool[] bIsPrevAI = new bool[5]; + } }