Programming (12) 썸네일형 리스트형 Macro 분기 vulkan 래핑 작업을 하던 중 로그 출력 및 에러 처리에 대한 필요성이 생겨 어떻게 구현할 지 고민했다. 생각해본 구현 요구사항은 다음과 같다. 1. 간단히 사용할 수 있어야 한다. 2. std library의 의존성을 최소화 해야 한다. 3. 어떤 파일의 몇 번째 줄에서 에러가 발생했는지 출력 할 수 있어야 한다. 4. 에러 혹은 로그의 수준에 따라 출력 포맷을 다르게 할 수 있어야 한다. 5. 에러 코드의 출력 여부를 선택할 수 있어야 한다. 요구사항 2 에 의해 선언부와 정의부를 분리해야 하므로, inline 및 template를 사용할 수 없다.요구사항 3 에 의해 매크로를 사용해야 한다. (__FILE__, __LINE__ 사용) - 호출 한 시점의 파일과 줄 번.. C++로 GetComponent<T>() 구현하기 유니티에서 컴포넌트를 찾아주는 GetComponent() 를 C++로 어떻게 구현할 수 있을지 고민했다. 먼저 GetComponent 함수의 형태를 보면 인자가 없으며 template를 사용한다는 것을 알 수 있고,함수의 결과로 컴포넌트를 찾아서 형변환하여 포인터 혹은 레퍼런스로 반환할 것이라는 예상을 할 수 있다. 그런데, 레퍼런스는 선언과 참조를 같이 해야하므로 사용할 수 없다. 따라서, 포인터로 component를 저장한다. template T* getComponent() { ... return static_cast(...);} 그럼, 여기서 "컴포넌트를 어떻게 구분하여 찾을 것인가?" 를 고민해봐야 한다. 객체는 다수의 컴포넌트를 가질 수 있으므로 삽입, 삭제, 검색 속도가 빠르.. 직선의 벡터 방정식으로 두 직선의 교점 찾기 들어가기 앞서, 직선의 벡터 방정식에 대한 이해가 필요하다. 글 참조 위의 글에서 직선의 벡터 방정식은 직선 L상의 어떤 한 점의 좌표를 의미한다고 했다.따라서, 두 직선 L1, L2가 만나면서 생기는 교점의 좌표는 두 벡터 방정식이 같은 경우를 말한다. 여기서, 교점의 위치를 결정하기 위해서 t값 혹은 u값을 구해야한다.직선 L1을 기준으로 하여 교점을 구하기위해 t값에 대해 정리하면 다음과 같다. 이 때, t는 실수값이므로, 벡터를 실수로 만들어주기 위해서 벡터 b와 벡터 d의 외적을 분모/분자에 내적한다.그리고 t에 대해 정리하면 다음과 같은 식을 도출할 수 있다. 위의 식에서 분모가 0이 아닐 때에만 두 직선의 교점이 생긴다. > 만약 직선이 아닌 선분 내에서 교차하는지를 알고싶다.. Unreal Engine 5 소스코드 편집기로 VScode 사용하기 Unreal Engine (이하 UE) 은 기본적으로 Visual Studio IDE를 사용하도록 세팅되어 있지만 너무 무겁다.그래서 비교적 가벼운 VScode를 기본 소스코드 편집기로 사용하는 방법에 대해 찾아봤고, 이에 대해서 기록한다. UE 5.3.2 버전, Windows 11 OS를 기준으로 작성된 글이므로 이후로 바뀔 가능성이 있다. 1. VScode 세팅1) VScode Extension에서 C# Dev Kit (Microsoft) 을 설치한다. 2) 만약 .NET SDK가 설치되어 있지 않다면 설치한다. (글 작성 기준 .NET SDK 8.0) 3) VScode Extension에서 C/C++ Extension Pack (Microsoft) 을 설치한다. 2. Unreal Engine 에디터.. AABB (Axis Aligned Bounding Box) 충돌 감지 AABB를 간단히 말해보자면 직각좌표계의 각 축에 정렬된 (평행한) 사각형 (Bounding Box 혹은 Collision Box) 에 대해서, 그 사각형이 가지는 최소 및 최대 좌표값을 이용하여 충돌을 판단한다. 각 축에 정렬되어 있다는 말은 객체가 회전하더라도 Bounding Box는 유지된다는 것을 의미한다. (Axis-Aligned)따라서, AABB 충돌 감지는 정밀한 검사가 불가능하지만, 간단한 조건 검사로 빠르다는 장점이 있다. 간단히 축 하나에 대해서 먼저 생각해본 뒤, 새로운 축을 만들어 확장하는 방식으로 알아보자. 쉽게 구하기 위해 축이 하나일 때, 겹치지 않는 두 가지 case 전체를 부정하는 방식으로 부등식을 구해보자. 1. A의 오른쪽 경계가 B의 왼쪽 경계보다 좌측에 위치해.. Type Selection 어떤 조건에 따라 컴파일 타임에 두 개의 타입 중 하나를 선택 가능하게 해주는 도구다.C++ 표준에서는 std::conditional 으로 제공된다. (C++11 이상) template struct IF { using type = B; };template struct IF { using type = A; };template using IF = typename IF::type; 위와 같이 템플릿 부분 특수화를 사용하여 구현된다. 동작 기준은 템플릿 인자 Condition이 결정한다.템플릿 인자 Condition의 값이 true이면 A 타입이 선택되고, false이면 B 타입이 선택된다. template struct IF { using type = .. EBO (Empty Base Optimization) EBO는 상속관계에서 이야기되며, 빈 클래스를 상속할 때 발생하는 메모리 최적화를 말한다. (EBCO 라고도 불린다)이 때, "빈 클래스" 라는 것은 가상 함수와 멤버 변수가 없는 클래스를 의미한다. (C++ 클래스 메모리 구조 참고) class EmptyClass { void interface() { ... } };int main() { EmptyClass objects[10]; cout 평상시에는 생성된 객체들에 대한 식별을 보장하기 위해 빈 클래스의 크기를 0이 아닌 값으로 할당한다. 위의 코드를 예시로 들어보면, 만약 EmptyClass의 크기가 0이라면 배열을 통해 각 객체들을 식별할 수 없을 것이다.따라서, 객체 고유성 유지를 위해 빈 클래스의 크기를 0이 아닌 값으로 할.. CRTP (Curiously Recurring Template Pattern) 클래스 템플릿인 기반 클래스에 유도 클래스의 형식을 템플릿 인수로 전달하는 패턴을 말한다. template class Base { ... };class Derived: public Base { ... }; 가장 간단한 예시를 들어보자면 위와 같은 패턴으로 형성된다.Derived Class는 Base Class를 상속하는데 템플릿 인수로 자기 자신인 Derived Class를 넘겨주고 있다. 간단한 사용 예시는 문제 발생 코드를 조금씩 해결하는 과정인 아래 코드들에서 확인할 수 있다. class Animal { public: ... void goBark() { bark(); } void bark() { cout 위의 코드를 실행시켜보면 당연히 An.. 이전 1 2 다음