提示コードですがRender.cppのgetScale_Sprite()関数で利用側でウインドウコンテキストを指定しているのですがこれはあまりよくないと思うのですが実際はどうするのが正解なのでしょうか?
1,現在ライブラリ側と利用側でプログラムを分けているのですがライブラリ側で公開するものとしてウインドウコンテキストはあまり正解ではないと思っていますなぜなら変更されると困るからです。
2,関数にウインドウコンテキストを設定すること自体がおかしいと思っています
Player のコンストラクタはどうやって呼んでいるのか(ライブラリ内? ライブラリ利用者?)
ライブラリ利用者のMain.cppで読んでいます。
Player::transform のコンストラクタ
transformのコンストラクタでは値を初期化しているだけです。継承等はしていません。
現状
windowsクラスで静的変数を用意してそれを利用側のMain.cppで確保して利用側の各所で使っています。
また複数のウインドウを用意したいと思っているのですがその場合、上記を踏まえた上でどういった実装が適切なのでしょうか?
Main.cpp
cpp
1 2int main() 3{ 4 if (glfwInit() != GLFW_TRUE) 5 { 6 assert(0 && "glfw 初期化失敗"); 7 } 8 9 //ウインドウコンテキスト確保 10 FrameWork::Window::windowContext = std::make_shared<FrameWork::Window>(glm::ivec2(800, 800), "Hello World"); 11 FrameWork::Window::windowContext->setCurrentContext(); 12 13 14 15 // OpenGL Verison 4.5 Core Profile 16 glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 4); 17 glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 5); 18 glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE); 19 glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE); 20 21 if (glewInit() != GLEW_OK) 22 { 23 assert(0 && "glew 初期化失敗"); 24 } 25
Windows.hpp
cpp
1class Window 2 { 3 4 public: 5 6 Window(const glm::ivec2 s,const char* t); //コンストラクタ 7 ~Window(); //デストラクタ 8 9 operator bool(); //bool 演算子 10 void SwapBuffers()const; //ダブルバッファリング 11 const glm::ivec2 getSize() const; //サイズ 12 void setCurrentContext(); //クライアントコンテキスト 13 14 //イベント処理 15 static void Resize_Event(GLFWwindow* win, const int width, const int height); //画面サイズ 16 static void DragAndDrop_Event(GLFWwindow* win, const int num, const char* str[]); //ドラック&ドロップ 17 static void MouseScroll_Event(GLFWwindow* win, const double x, const double y); //マウススクロール 18 static void KeyInputChar_Event(GLFWwindow* win, const unsigned int n); //テキスト入力 19 static void KeyInput_Event(GLFWwindow* win, const int key, const int scanCode, const int action, const int mods); //キー入力 20 static void MouseMove_Event(GLFWwindow* win, const double xpos, const double ypos); //マウス 21 22 23 bool getKeyInput(int keyCode); 24 25 static std::shared_ptr<FrameWork::Window> windowContext; 26 27 private: 28 29 std::string title; //ウインドウタイトル 30 glm::ivec2 size; //画面サイズ 31 32 GLFWwindow* window; //ウインドウコンテキスト 33 34 std::array<short int,GLFW_KEY_MENU> keyBoard; //キー入力 35 unsigned int inputKey; //テキスト入力 36 37 double mouseWheel; //マウスホイール 38 glm::dvec2 mousePosition; //マウス座標 39 std::vector<std::string> drop; //ドラック&ドロップ 40 }; 41 42
getMatScale_Sprite
cpp
1/*############################################################################################ 2# サイズケール 取得 3############################################################################################*/ 4glm::mat4 FrameWork::Transform::getMatScale_Sprite(const std::shared_ptr<FrameWork::Window> window)const 5{ 6 glm::vec2 size; 7 //UV座標 8 float sizeX = 1.0f / (float)window->getSize().x; 9 float sizeY = 1.0f / (float)window->getSize().y; 10 11 size.x = sizeX * 128; 12 size.y = sizeY * 128; 13 14 15 return glm::scale(glm::mat4(1), glm::vec3(size, 1.0f)); 16}
Render
cpp
1 2void Player::Render(const glm::mat4 view) 3{ 4 sprite.shader->setEnable(); 5 6 7 sprite.shader->setUniform4f("uFragment",glm::vec4(0.0,0.0,1.0,1.0)); 8 sprite.shader->setUniformMatrix4x4fv("uViewProjection", view); 9 sprite.shader->setUniformMatrix4x4fv("uScale", transform.getMatScale_Sprite(FrameWork::Window::windowContext)); 10 sprite.shader->setUniformMatrix4x4fv("uTranslate", transform.getMatPosition()); 11 sprite.shader->setUniformMatrix4x4fv("uRotate", transform.getMatRotate()); 12 13 sprite.Render(view); 14 15 sprite.shader->setDisable(); 16 17} 18 19void Player::Update() 20{ 21 //sprite.setTexture(0, texture.at(0)); 22} 23 24 25
「複数のウインドウを用意したい」==「複数の FrameWork::Window を同時に扱える必要がある」ということで間違いないですか?
Player のコンストラクタはどうやって呼んでいるのか(ライブラリ内? ライブラリ利用者?)とか、Player::transform のコンストラクタはどうやって呼んでいるのかとかの情報があると答えやすいです。

> 「複数のウインドウを用意したい」==「複数の FrameWork::Window を同時に扱える必要がある」
そうです。
FrameWork::Window::windowContextをライブラリ利用側で引数として記述するのを辞めたいそれでいて複数のウインドウを扱う場合の処理の書き方が知りたいです。
glfwWindowHint() のタイミング遅すぎたりしないんですかね,コレ.

そうなのでしょうか?ではどの順番なのでしょうか?自分はこれで問題なのですが
glfwWindowHint() は,以降の glfwCreateWindow() に効いてくる物だから,大丈夫なん?って思っただけ.
(実際にあなたがいつ glfwCreateWindow() を用いているか次第だけど,例えば Window 型のコンストラクタ内でやってるとしたら,その Main.cpp のコードだと順序が逆順になるんじゃね?,と.)
回答2件
あなたの回答
tips
プレビュー