0511 일시적최상단GUI
글 좀 수정한다.
컬러피커, 스핀박스(에 필요한 리스트) 는
"IViewport"에 하나면 족하다.
그냥 뷰포트 기준, 글로벌로 만들어 두고,
한 오브젝트가
"컬러피커 띄워 주세요. dst는 저입니다. 이 함수를 통해 값을 주세요"
라는 걸 요청 하면?
컬러피커가 띄워져 있을 동안,
컬러피커의 RGB값이 콜백을 통해서 전달된다.
단, (IViewport기준으로 컬러피커가 띄워져 있는데 클릭이 났고, 콜리젼 실패했다면?)
또는
("컬러피커 내려 주세요" 라는 요청이 왔다면)
-> 이럴 경우에는 그냥 컬러피커 비활성화 하면 된다.
명심할 것.
1. "요청하는 형태가 아닌 "평범한 컬러피커" 는
그냥 뭉탱이로 구현하면 된다
// (뭉탱이로, 고정된 스타일로 구현하는 게 핵심이다).
// 스타일 바꾸는 건 Theme에서....
2. "최상단 GUI 요청이 들어왔을 때, 스크린(=뷰포트 크기)을 벗어나면 안 되도록,
사이즈에 맞춰 적절히 포지션을 조정하자."
3. 요청을 줄 때, 어느 월드 위치에다가 띄워야 하는지도 명시해야 한다.
물론 그 위치에 반드시 띄워진다는 보장은 없다. (2)번 조항 때문에.
// ======================================== //
이는 SpinBox, ColorPicker 같이
다른 데를 누르면 바로 사라지지만,
띄우고 아무 짓도 안하면 계속 남아있는 것이며,
"IViewport당 1개만이 띄워질 수 있다."
-> 이들은 매 프레임마다
(포커싱되어있는데 && (추가적으로 띄워진거 기준) 콜리젼실패
&& focused가 this였다면)
focused를 nullptr로 바꿀 의무가 있다.
그리고?????
get_viewport().set_top_object를 nullptr로 한다.
여기서 top_object개념이란,
IViewport가 모든 오브젝트들을 다 그린 후에
그 위에다가 추가적으로 그릴 오브젝트를 뜻하는데,
IControl* m_top_object에다가 ColorPicker를 넣어 놓으면,
IViewport가 렌더링 이후에
virtual IControl::draw_top() const // 가상함수 아님
m_top_object의 이 메서드를 불러서
ColorPicker의 draw_top을 실행하고?
ColorPicker의 draw_top() const override 에서는
"자신의 월드 rect포지션을 기준으로
적절한 곳에다가"
컬러피커 UI를 그리면 된다.