class Texture : public GameObjectComponent
{
public:
Texture();
~Texture();
void SetTexture(MeshTexture* pTexture, TEXTURE_TYPE textureType);
/**
@brief 해당 텍스쳐 타입의 텍스쳐를 반환한다.
@return 텍스쳐가 존재하지 않을 경우 nullptr 반환
*/
MeshTexture* GetTexture(TEXTURE_TYPE textureType);
private:
std::map<TEXTURE_TYPE,std::shared_ptr<MeshTexture>> m_tblTextures;
};
지금 설계중인 클래스 중 하나인데
GetTexture 가 nullptr 일 경우 디폴트 값을 쓰고 싶음.
그렇다면 호출하는 쪽에서 바로 Texture::DefaultTexture 만 참조하면
디폴트 값을 가진 MeshTexture* 객체를 얻게 하고 싶거든
그런데 문제는 static 변수로 만들어서 하자니 MeshTexture는 객체 생성 후에 디폴트 값으로 초기화 해줘야 함...
즉 어딘가에서 static MeshTexture* DefaultTexture에 대해 최소 한번 초기화 해주는 루틴이 필요하단거임
그리고 난 이걸 원하지 않어.
그래서 두번째로 생각한게
class DefaultTexture : public MeshTexture
로 아예 상속해버려서 생성자에서 디폴트값으로 초기화 하는 방법.
이건 작동 할거 같은데 쓸데없이 클래스가 하나 늘어나고 "객체"로서 쓰인다는 개념이 아니게 됨.
뭔가 더 좋은 방법 없을까???
두번째 방법은 Null Object 라고 리팩토링 방법이네.
혹시 static 지역 객체는 어때??ㅎㅎ
ㄴ 아 이것도 안되겠구나
두번째가 좀더 나은 방향일꺼 같은데... 검색 키워드는 구글에다가 "Introduce Null object" 라고 쳐보시면...
map 에 타입을 키로 하는 텍스쳐는 뭐냐? 같은 파일 공유는 아닌 거 같고?
렌더타겟 텍스쳐냐?
ㄴ 그냥 셰이더리소스뷰임. 맵으로 한건 enum으로 디퓨즈, 노말 등 용도 구분할라고
몇 안되는 것을 왜 맵으로 함?
렌더타겟 아니면 그냥 관리자에서 초기화할때 디폴트텍스쳐 하나 만들어두고 참조해오면 대는거 아님?
ㄴ 본문에도 나와있지만 그 관리자에서 디폴트 텍스쳐 만드는 과정을 하기 싫어서; 매니저클래스는 안 쓰고 있지만 하여간 Texture 클래스에서 해결 안하면 복잡도만 늘어나게 됨
다른 종류의 메쉬가 같은 이름의 텍스쳐파일사용하면? 그거 관리하는 거 안 만들게?
관리자 두는게 편할걸?
ㄴ 흠 지금 쓰는 방식이 리소스풀에서 포인터만 끌어다 쓰고 있는데 생각해보니 님이 말했던 대로 그냥 리소스풀에 디폴트로 쓸거 올려두면 되겠네. 뭔가 어렵게 생각한거 같음 ㄳㄳ
리소스풀 있으면 다 한거네
ㅊㅊ
ㄴ 맵도 봐보니까 굳이 맵 안쓰고 vector 써도 될것 같네. 지적해주기 전엔 눈치못챔
4개정도면 그냥 배열이 날듯 벡터쓰면 벡터크기+내부동적할당비용 하면 손해일듯