9주차 진행사항 - Ritebart/3DGameArchitecture GitHub Wiki

4. 9주차 진행 사항

오브젝트 초기화는 추상 클래스 IInit 클래스를 상속받는 자식 클래스의 Init()으로 실행됨.

오브젝트 업데이트는 추상 클래스 IUpdater 클래스를 상속받는 자식 클래스의 Update()로 실행됨

오브젝트 소멸처리는 추상 클래스 IClean 클래스를 상속받는 자식 클래스의 Clean()으로 실행됨

오브젝트 렌더링은 기존의 Renderer 클래스의 Render() 함수 안에서 RenderableObject 클래스를 상속받는 자식 클래스들의 객체만 그리며 NonRenderableObject 클래스를 상속받는 자식 클래스들의 객체는 그리지 않게 실행되므로 그대로 역할을 유지함.

MakeableObjectFucCall 클래스 (추가된 클래스)

구조를 템플릿화 시키기 위해 만든 클래스이며 싱클톤 패턴이 적용되어 있다. 가지고 있는 함수는 

void AddInitObject(IInit* init) IInit 클래스를 상속받는 클래스 객체들을 집어넣기 위함.
void AddUpdateObject(IUpdater* updater) IUpdater클래스를 상속받는 클래스 객체들을 집어넣기 위함.
void AddCleanObject(IClean* cleaner) IClean 클래스를 상속받는 클래스 객체들을 집어넣기 위함.

void CallAllInit() AddInitObject()를 통해 넣어진 모든 객체들의 Init() 실행
void CallAllUpdate() AddUpdateObject()를 통해 넣어진 모든 객체들의 Update() 실행
void CallAllClean() AddCleanObject()를 통해 넣어진 모든 객체들의 Clean() 실행

이며, Private 영역에 IInit, IUpdater, IClean 클래스 타입으로 선언된 vector가 존재하며 Add 계열 함수에서 추가한다.

IInit 클래스 (추가된 클래스)

IUpdater 클래스, IClean 클래스와 마찬가지로 이 클래스를 상속받는 클래스에 Init() 함수의 강제 재정의를 위함과 상속받는 클래스 객체들을 모아 일괄적으로 실행시키기 
위함

RenderableObject 클래스

RenderableObject 클래스를 상속받은 클래스의 생성자 호출에는 RenderableObject 생성자의 호출도 되므로 기본 생성자인 RenderableObject() 안에
MakeableObjectFucCall::Instance()->AddUpdateObject(this);
MakeableObjectFucCall::Instance()->AddCleanObject(this);
MakeableObjectFucCall::Instance()->AddInitObject(this);
를 통해 자식 클래스의 Init(), Update(), Clean()를 실행시킬 수 있게 만든다.

오버로딩 생성자인 RenderableObject(const char* filepath, float x, float y, float z)를 만들어
이를 자식의 생성자에서 자식의 생성자(const char* filepath, float x, float y, float z) : RenderableObject(filepath, x, y, z)
로 구성하여 자식의 객체를 생성할 때 OBJ 파일의 이름, 생성하고픈 위치 좌표 값 xyz를 넣어 생성하면, 자동으로 오버로딩 생성자에 해당 값으로 호출하여 값을 집어넣어서
따로 함수를 호출하지 않아도 화면에 그려질 수 있다.

NonRenderableObject 클래스

RenderableObject 클래스의 기본 생성자는 NonRenderableObject 클래스의 기본생성자와 동일하게 구성되어 
자식 클래스의 Init(), Update(), Clean()를 실행시킨다.

NonRenderableObject 클래스를 상속받아 사용할만한 것중 대표적인 Camera는 생성할 때 필요한 값이 꽤나 많기에 이를 단순히 생성자에서 넣어 만들기는
더 헷갈릴 가능성이 큼. 그래서 추가적인 오버로딩 생성자를 만들어 놓진 않고 나중에 더 획기적인 방법이 떠오르면 추가하기.

Renderer 클래스

게임 내에 여러개의 Renderer 객체가 필요친 않으므로 싱글톤 패턴화 시킴.

Render()의 이 프로그램의 지속적인 진행 부분인 do ~ while 문 시작 전 MakeableObjectFucCall의 CallAllinit()을 호출해 모든 init() 실행.
Render()에서 호출되는 Renderer 클래스의 Update() 함수안에서 MakeableObjectFucCall의 CallAllUpdate()를 호출해 모든 Update() 실행.
Redner()에 do ~ while 문이 끝난 뒤 호출되는 Renderer 클래스의 Clean() 안에서 MakeableObjectFucCall의 CallAllClean()을 호출해 모든 Clean() 실행.

main

Cube* cube = new Cube("cube.obj", 3.0f, 0.0f, 0.0f)와 같이 생성자를 통한 생성만으로 프로그램의 순환에 cube 객체가 반영되어 진행되게 변경됨. 그 뒤
Renderer::Instance()->SetWindowSize(1600, 1200);
Renderer::Instance()->Render();
만 실행해주면 화면에 바로 그려진다.