init commit

This commit is contained in:
2025-06-11 22:45:11 +08:00
commit 71307f3e53
115 changed files with 13922 additions and 0 deletions
+207
View File
@@ -0,0 +1,207 @@
set(DV_CORE_INCLUDE_FILES
include/dvc_config.h
include/dvc_pre_declare.h
)
source_group("include" FILES ${DV_CORE_INCLUDE_FILES})
#################
# math
#################
set(DV_CORE_MATH_INCLUDE_FILES
include/math/dvc_vector2.h
include/math/dvc_vector3.h
include/math/dvc_vector4.h
include/math/dvc_matrix3.h
include/math/dvc_matrix4.h
include/math/dvc_math_util.h
include/math/dvc_fixmath.h
)
source_group("include/math" FILES ${DV_CORE_MATH_INCLUDE_FILES})
set(DV_CORE_MATH_SOURCE_FILES
source/math/dvc_vector2.cpp
source/math/dvc_vector3.cpp
source/math/dvc_vector4.cpp
source/math/dvc_matrix3.cpp
source/math/dvc_matrix4.cpp
source/math/dvc_math_util.cpp
)
source_group("source/math" FILES ${DV_CORE_MATH_SOURCE_FILES})
#################
# scene
#################
set(DV_CORE_SCENE_INCLUDE_FILES
include/scene/dvc_scene.h
include/scene/dvc_scene_node.h
)
source_group("include/scene" FILES ${DV_CORE_SCENE_INCLUDE_FILES})
set(DV_CORE_SCENE_SOURCE_FILES
source/scene/dvc_scene.cpp
source/scene/dvc_scene_node.cpp
)
source_group("source/scene" FILES ${DV_CORE_SCENE_SOURCE_FILES})
#################
# scene component
#################
set(DV_CORE_SCENE_COMPONENT_INCLUDE_FILES
include/scene/component/dvc_component.h
include/scene/component/dvc_mesh_component.h
include/scene/component/dvc_camera_component.h
include/scene/component/dvc_light_component.h
)
source_group("include/scene/component" FILES ${DV_CORE_SCENE_COMPONENT_INCLUDE_FILES})
set(DV_CORE_SCENE_COMPONENT_SOURCE_FILES
source/scene/component/dvc_component.cpp
source/scene/component/dvc_mesh_component.cpp
source/scene/component/dvc_camera_component.cpp
source/scene/component/dvc_light_component.cpp
)
source_group("source/scene/component" FILES ${DV_CORE_SCENE_COMPONENT_SOURCE_FILES})
#################
# asset
#################
set(DV_CORE_ASSET_INCLUDE_FILES
include/asset/dvc_mesh.h
)
source_group("include/asset" FILES ${DV_CORE_ASSET_INCLUDE_FILES})
set(DV_CORE_ASSET_SOURCE_FILES
source/asset/dvc_mesh.cpp
)
source_group("source/asset" FILES ${DV_CORE_ASSET_SOURCE_FILES})
#################
# device
#################
set(DV_CORE_DEVICE_INCLUDE_FILES
include/device/dvc_buffer.h
include/device/dvc_buffer_view.h
include/device/dvc_buffer_accessor.h
include/device/dvc_render_target.h
include/device/dvc_pixel_buffer.h
include/device/dvc_uniform_buffer.h
include/device/dvc_vertex_desc.h
)
source_group("include/device" FILES ${DV_CORE_DEVICE_INCLUDE_FILES})
set(DV_CORE_DEVICE_SOURCE_FILES
source/device/dvc_buffer.cpp
source/device/dvc_buffer_view.cpp
source/device/dvc_buffer_accessor.cpp
source/device/dvc_render_target.cpp
source/device/dvc_pixel_buffer.cpp
source/device/dvc_uniform_buffer.cpp
source/device/dvc_vertex_desc.cpp
)
source_group("source/device" FILES ${DV_CORE_DEVICE_SOURCE_FILES})
#################
# pipe
#################
set(DV_CORE_PIPE_INCLUDE_FILES
include/pipe/dvc_render_queue.h
include/pipe/dvc_renderable.h
include/pipe/dvc_renderable_entity.h
include/pipe/dvc_render_step_IA.h
include/pipe/dvc_render_step_VS.h
include/pipe/dvc_render_step_PS.h
include/pipe/dvc_rasterizer.h
)
source_group("include/pipe" FILES ${DV_CORE_PIPE_INCLUDE_FILES})
set(DV_CORE_PIPE_SOURCE_FILES
source/pipe/dvc_render_queue.cpp
source/pipe/dvc_renderable.cpp
source/pipe/dvc_renderable_entity.cpp
source/pipe/dvc_render_step_IA.cpp
source/pipe/dvc_render_step_VS.cpp
source/pipe/dvc_render_step_PS.cpp
source/pipe/dvc_rasterizer_triangle.cpp
)
source_group("source/pipe" FILES ${DV_CORE_PIPE_SOURCE_FILES})
#################
# shader
#################
set(DV_CORE_SHADER_INCLUDE_FILES
include/shader/dvc_shader_interface.h
)
source_group("include/shader" FILES ${DV_CORE_SHADER_INCLUDE_FILES})
set(DV_CORE_SHADER_SOURCE_FILES
source/shader/dvc_shader_interface.cpp
)
source_group("source/shader" FILES ${DV_CORE_SHADER_SOURCE_FILES})
#################
# core library
#################
include_directories(
${DV_AUTO_INCLUDE_PATH}
${CMAKE_CURRENT_SOURCE_DIR}/include
)
add_library(dv_core SHARED
${DV_CORE_INCLUDE_FILES}
${DV_CORE_MATH_INCLUDE_FILES}
${DV_CORE_MATH_SOURCE_FILES}
${DV_CORE_SCENE_INCLUDE_FILES}
${DV_CORE_SCENE_SOURCE_FILES}
${DV_CORE_SCENE_COMPONENT_INCLUDE_FILES}
${DV_CORE_SCENE_COMPONENT_SOURCE_FILES}
${DV_CORE_DEVICE_INCLUDE_FILES}
${DV_CORE_DEVICE_SOURCE_FILES}
${DV_CORE_ASSET_INCLUDE_FILES}
${DV_CORE_ASSET_SOURCE_FILES}
${DV_CORE_PIPE_INCLUDE_FILES}
${DV_CORE_PIPE_SOURCE_FILES}
${DV_CORE_SHADER_INCLUDE_FILES}
${DV_CORE_SHADER_SOURCE_FILES}
)
target_compile_definitions(dv_core
PRIVATE DV_CORE_EXPORTS
)
#################
# copy runtime dll(for debug)
#################
add_custom_command(
TARGET dv_core POST_BUILD
COMMAND ${CMAKE_COMMAND} -E copy_if_different $<TARGET_FILE:dv_core> ${CMAKE_BINARY_DIR}/source/console/$<$<CONFIG:Debug>:Debug>$<$<CONFIG:Release>:Release>)
add_custom_command(
TARGET dv_core POST_BUILD
COMMAND ${CMAKE_COMMAND} -E copy_if_different $<TARGET_FILE:dv_core> ${CMAKE_BINARY_DIR}/test/unit/$<$<CONFIG:Debug>:Debug>$<$<CONFIG:Release>:Release>)
add_custom_command(
TARGET dv_core POST_BUILD
COMMAND ${CMAKE_COMMAND} -E copy_if_different $<TARGET_FILE:dv_core> ${CMAKE_BINARY_DIR}/test/rasterization/$<$<CONFIG:Debug>:Debug>$<$<CONFIG:Release>:Release>)
#################
# install
#################
install(DIRECTORY include/
DESTINATION include/core
FILES_MATCHING
PATTERN "*.h"
)
if(MSVC)
install(TARGETS dv_core
RUNTIME DESTINATION bin/$<$<CONFIG:Debug>:Debug>$<$<CONFIG:Release>:Release>
ARCHIVE DESTINATION lib/$<$<CONFIG:Debug>:Debug>$<$<CONFIG:Release>:Release>
)
else(MSVC)
install(TARGETS dv_core
RUNTIME DESTINATION bin
ARCHIVE DESTINATION lib
)
endif(MSVC)
+42
View File
@@ -0,0 +1,42 @@
#pragma once
#include "dvc_config.h"
#include "dvc_pre_declare.h"
DV_CORE_BEGIN_NAMESPACE
class DV_CORE_API Mesh
{
public:
typedef std::map<VertexElementType, DeviceBufferAccessorConstPtr> PrimitiveAttributes;
struct Primitive
{
PrimitiveType type;
PrimitiveAttributes attributes;
DeviceBufferAccessorConstPtr indices;
};
typedef std::shared_ptr<Primitive> PrimitivePtr;
typedef std::shared_ptr<const Primitive> PrimitiveConstPtr;
typedef std::vector<PrimitivePtr> PrimitiveArray;
public:
const std::string& getName(void) const {
return m_name;
}
PrimitivePtr newPrimitive(void);
int32_t getPrimitiveCounts(void) const {
return (int32_t)m_primitiveArray.size();
}
PrimitiveConstPtr getPrimitive(int32_t index) const;
private:
std::string m_name;
PrimitiveArray m_primitiveArray;
public:
Mesh(const std::string& name);
~Mesh();
};
DV_CORE_END_NAMESPACE
+32
View File
@@ -0,0 +1,32 @@
#pragma once
#include "dvc_config.h"
DV_CORE_BEGIN_NAMESPACE
class DV_CORE_API DeviceBuffer
{
public:
void init(size_t _length);
void clear(void);
size_t length(void) const { return m_length; }
const uint8_t* ptr(size_t offseet) const {
return m_ptr + offseet;
}
uint8_t* ptr(size_t offseet) {
return m_ptr + offseet;
}
private:
uint8_t* m_ptr;
size_t m_length;
public:
DeviceBuffer();
DeviceBuffer(size_t _length);
~DeviceBuffer();
};
DV_CORE_END_NAMESPACE
@@ -0,0 +1,58 @@
#pragma once
#include "dvc_buffer_view.h"
DV_CORE_BEGIN_NAMESPACE
class DV_CORE_API DeviceBufferAccessor
{
public:
const DeviceBufferViewConstPtr getBufferView(void) const {
return m_bufferView;
}
void walk(std::function<bool(const uint8_t*, size_t)> callback, size_t start = 0, size_t end = ((size_t)-1)) const;
void walk2(std::function<bool(const uint8_t*, const uint8_t*, size_t)> callback, size_t start = 0, size_t end = ((size_t)-1)) const;
void walk3(std::function<bool(const uint8_t*, const uint8_t*, const uint8_t*, size_t)> callback, size_t start = 0, size_t end = ((size_t)-1)) const;
const uint8_t* getElement(size_t index) const;
size_t getOffset(void) const {
return m_offset;
}
size_t getCount(void) const {
return m_count;
}
ComponentType getComponentType(void) const {
return m_componentType;
}
DataType getDataType(void) const {
return m_dataType;
}
size_t getElementSize(void) const {
return m_elementSize;
}
private:
DeviceBufferViewConstPtr m_bufferView;
size_t m_offset;
size_t m_count;
ComponentType m_componentType;
DataType m_dataType;
size_t m_elementSize;
public:
DeviceBufferAccessor(DeviceBufferViewConstPtr bufferView, size_t offset, size_t count, ComponentType componentType, DataType dataType);
~DeviceBufferAccessor();
};
DV_CORE_END_NAMESPACE
@@ -0,0 +1,38 @@
#pragma once
#include "dvc_buffer.h"
#include "dvc_pre_declare.h"
DV_CORE_BEGIN_NAMESPACE
class DV_CORE_API DeviceBufferView
{
public:
const DeviceBufferConstPtr getBuffer(void) const {
return m_buffer;
}
size_t getOffset(void) const {
return m_offset;
}
size_t getLength(void) const {
return m_length;
}
size_t getStride(void) const {
return m_stride;
}
private:
DeviceBufferConstPtr m_buffer;
size_t m_offset;
size_t m_length;
size_t m_stride;
public:
DeviceBufferView(DeviceBufferConstPtr buffer, size_t offset, size_t length, size_t stride);
~DeviceBufferView();
};
DV_CORE_END_NAMESPACE
@@ -0,0 +1,55 @@
#pragma once
#include "dvc_config.h"
DV_CORE_BEGIN_NAMESPACE
template<typename T>
class PixelBuffer
{
public:
void init(int width, int height, const T& pixel) {
assert(width > 0 && width < 0xFFFF);
assert(height > 0 && height < 0xFFFF);
m_width = width;
m_height = height;
m_pixelBuffer.resize((size_t)(width * height));
clear(pixel);
}
void clear(const T& pixel) {
std::fill(m_pixelBuffer.begin(), m_pixelBuffer.end(), pixel);
}
void setPixel(int32_t x, int32_t y, const T& pixel) {
assert(x >= 0 && x < m_width);
assert(y >= 0 && y < m_height);
m_pixelBuffer[(size_t)(y * m_width + x)] = pixel;
}
const T& getPixel(int32_t x, int32_t y) const {
assert(x >= 0 && x < m_width);
assert(y >= 0 && y < m_height);
return m_pixelBuffer[(size_t)(y * m_width + x)];
}
const T* ptr(void) const {
return &(m_pixelBuffer[0]);
}
int32_t getWidth(void) const { return m_width; }
int32_t getHeight(void) const { return m_height; }
protected:
std::vector<T> m_pixelBuffer;
int32_t m_width;
int32_t m_height;
public:
PixelBuffer() : m_width(0), m_height(0) {}
};
DV_CORE_END_NAMESPACE
@@ -0,0 +1,33 @@
#pragma once
#include "dvc_config.h"
#include "math/dvc_vector4.h"
#include "dvc_pixel_buffer.h"
DV_CORE_BEGIN_NAMESPACE
class DV_CORE_API RenderTarget
{
public:
void init(int32_t width, int32_t height);
void clear();
void setPixel(int32_t x, int32_t y, const fVector4& color, float32_t depth);
int32_t getWidth(void) const { return m_width; }
int32_t getHeight(void) const { return m_height; }
const PixelBuffer<fVector4>& getColorBuffer(void) const { return m_colorBuffer; }
const PixelBuffer<float32_t>& getDepthBuffer(void) const { return m_depthBuffer; }
private:
int32_t m_width;
int32_t m_height;
PixelBuffer<fVector4> m_colorBuffer;
PixelBuffer<float32_t> m_depthBuffer;
public:
RenderTarget();
~RenderTarget() {}
};
DV_CORE_END_NAMESPACE
@@ -0,0 +1,51 @@
#pragma once
#include "dvc_config.h"
#include "math/dvc_vector2.h"
#include "math/dvc_vector3.h"
#include "math/dvc_vector4.h"
#include "math/dvc_matrix3.h"
#include "math/dvc_matrix4.h"
DV_CORE_BEGIN_NAMESPACE
class DV_CORE_API UniformBuffer
{
public:
struct AttributeValue
{
std::string name;
ComponentType componentType;
DataType dataType;
void* value;
};
typedef std::map<std::string, AttributeValue> AttributeMap;
public:
void clear();
void updateStandardAttribute(const Scene& scene);
void setAttribute(const std::string& name, ComponentType componentType, DataType dataType, const void* value);
void setAttribute(const std::string& name, const int32_t& value);
void setAttribute(const std::string& name, const float32_t& value);
void setAttribute(const std::string& name, const fVector2& value);
void setAttribute(const std::string& name, const fVector3& value);
void setAttribute(const std::string& name, const fVector4& value);
void setAttribute(const std::string& name, const fMatrix3& value);
void setAttribute(const std::string& name, const fMatrix4& value);
void* getAttribute(const std::string& name) const;
void removeAttribute(const std::string& name);
private:
void* mallocMemory(size_t size);
void freeMemory(void* memory);
protected:
AttributeMap m_attributeMap;
};
DV_CORE_END_NAMESPACE
@@ -0,0 +1,47 @@
#pragma once
#include "dvc_config.h"
DV_CORE_BEGIN_NAMESPACE
//Description of a vertex data
class DV_CORE_API VertexDesc
{
public:
struct Element
{
std::string name;
VertexElementType elementType;
ComponentType componentType;
DataType dataType;
size_t offset; //byte offset
size_t size; //byte size
};
public:
bool addElement(const std::string& name, VertexElementType elementType,
ComponentType componentType, DataType dataType);
const Element* getElement(size_t index) const;
const Element* getElement(VertexElementType elementType) const;
const Element* getElement(const std::string& name) const;
//total byte size of each vertex
size_t vertexByteSize(void) const { return m_vertexSize; }
private:
typedef std::vector< Element > ElementBuf;
ElementBuf m_elements;
size_t m_vertexSize;
std::map< VertexElementType, ElementBuf::size_type> m_elementTypeMap;
std::map< std::string, ElementBuf::size_type> m_nameMap;
public:
VertexDesc();
VertexDesc(const VertexDesc& other);
~VertexDesc() {}
};
DV_CORE_END_NAMESPACE
+105
View File
@@ -0,0 +1,105 @@
#pragma once
#include "dv_config.h"
#ifdef DV_CORE_EXPORTS
#define DV_CORE_API __declspec(dllexport)
#else
#define DV_CORE_API __declspec(dllimport)
#endif
//core namespace
#define DV_CORE_BEGIN_NAMESPACE namespace davinci {
#define DV_CORE_END_NAMESPACE }
//basic types
DV_CORE_BEGIN_NAMESPACE
enum ComponentType
{
CT_UNKNOWN,
CT_Int8,
CT_Uint8,
CT_Int16,
CT_Uint16,
CT_Int32,
CT_Uint32,
CT_Float32,
CT_Float64,
};
enum DataType
{
DT_UNKNOWN,
DT_Scalar,
DT_Vec2,
DT_Vec3,
DT_Vec4,
DT_Matrix2,
DT_Matrix3,
DT_Matrix4,
};
enum VertexElementType
{
VET_UNKNOWN,
VET_POSITION,
VET_NORMAL,
VET_TANGENT,
VET_BINORMAL,
VET_TEXCOORD_0, VET_TEXCOORD_1, VET_TEXCOORD_2, VET_TEXCOORD_3,
VET_TEXCOORD_4, VET_TEXCOORD_5, VET_TEXCOORD_6, VET_TEXCOORD_7,
VET_TEXCOORD_LAST=VET_TEXCOORD_7,
VET_COLOR_0, VET_COLOR_1, VET_COLOR_2, VET_COLOR_3,
VET_COLOR_4, VET_COLOR_5, VET_COLOR_6, VET_COLOR_7,
VET_COLOR_LAST=VET_COLOR_7,
VET_JOINTS_0, VET_JOINTS_1, VET_JOINTS_2, VET_JOINTS_3,
VET_JOINTS_4, VET_JOINTS_5, VET_JOINTS_6, VET_JOINTS_7,
VET_JOINTS_LAST=VET_JOINTS_7,
VET_WEIGHTS_0, VET_WEIGHTS_1, VET_WEIGHTS_2, VET_WEIGHTS_3,
VET_WEIGHTS_4, VET_WEIGHTS_5, VET_WEIGHTS_6, VET_WEIGHTS_7,
VET_WEIGHTS_LAST=VET_WEIGHTS_7,
VET_STANDARD_LAST=VET_WEIGHTS_LAST,
};
enum PrimitiveType
{
PT_UNKNOWN,
PT_POINT_LIST,
PT_LINE_LIST,
PT_LINE_LOOP,
PT_LINE_STRIP,
PT_TRIANGLE_LIST,
PT_TRIANGLE_STRIP,
PT_TRIANGLE_FAN,
};
enum PixelFormat
{
//96-bit pixel format, 32 bits (float) for red, 32 bits (float) for green, 32 bits (float) for blue
PF_FLOAT32_RGB,
/// 128-bit pixel format, 32 bits (float) for red, 32 bits (float) for green, 32 bits (float) for blue, 32 bits (float) for alpha
PF_FLOAT32_RGBA,
// 32-bit pixel format, 32 bits (float) for red
PF_FLOAT32_R,
/// 132-bit pixel format, 8 bits (float) for red, 8 bits (float) for green, 8 bits (float) for blue, 8 bits (float) for alpha
PF_UINT8_RGBA,
};
DV_CORE_END_NAMESPACE
+73
View File
@@ -0,0 +1,73 @@
#pragma once
#include <vector>
// Pre-declare classes
DV_CORE_BEGIN_NAMESPACE
template <typename T>
class TVector2;
template <typename T>
class TVector3;
template <typename T>
class TVector4;
template <typename T>
class TMatrix4;
class DeviceBuffer;
typedef std::shared_ptr<DeviceBuffer> DeviceBufferPtr;
typedef std::shared_ptr<const DeviceBuffer> DeviceBufferConstPtr;
class DeviceBufferView;
typedef std::shared_ptr<DeviceBufferView> DeviceBufferViewPtr;
typedef std::shared_ptr<const DeviceBufferView> DeviceBufferViewConstPtr;
class DeviceBufferAccessor;
typedef std::shared_ptr<DeviceBufferAccessor> DeviceBufferAccessorPtr;
typedef std::shared_ptr<const DeviceBufferAccessor> DeviceBufferAccessorConstPtr;
class RenderTarget;
class Mesh;
typedef std::shared_ptr<Mesh> MeshPtr;
typedef std::shared_ptr<const Mesh> MeshConstPtr;
class Scene;
class SceneNode;
typedef std::shared_ptr<SceneNode> SceneNodePtr;
typedef std::shared_ptr<const SceneNode> SceneNodeConstPtr;
typedef std::vector<SceneNodePtr> SceneNodeArray;
class SceneComponent;
typedef std::shared_ptr<SceneComponent> SceneComponentPtr;
typedef std::shared_ptr<const SceneComponent> SceneComponentConstPtr;
typedef std::vector<SceneComponentPtr> SceneComponentArray;
class MeshComponent;
typedef std::shared_ptr<MeshComponent> MeshComponentPtr;
typedef std::shared_ptr<const MeshComponent> MeshComponentConstPtr;
class CameraComponent;
typedef std::shared_ptr<CameraComponent> CameraComponentPtr;
typedef std::shared_ptr<const CameraComponent> CameraComponentConstPtr;
class LightComponent;
typedef std::shared_ptr<LightComponent> LightComponentPtr;
typedef std::shared_ptr<const LightComponent> LightComponentConstPtr;
class RenderQueue;
class Renderable;
typedef std::shared_ptr<Renderable> RenderablePtr;
typedef std::shared_ptr<const Renderable> RenderableConstPtr;
class VertexShaderInterface;
class UniformBuffer;
DV_CORE_END_NAMESPACE
+98
View File
@@ -0,0 +1,98 @@
#pragma once
#include "dvc_config.h"
DV_CORE_BEGIN_NAMESPACE
typedef int64_t ifloat_t;
//typedef int64_t ifloat2_t[2];
//typedef int64_t ifloat3_t[3];
#define IFLOAT_SHIFT (16)
#define IFLOAT_SCALE ((float64_t)(1<<IFLOAT_SHIFT))
//-------------------------------------------------------------------------------------
inline ifloat_t ifloat_init(float32_t a)
{
return (ifloat_t)((float64_t)a * IFLOAT_SCALE + 0.5);
}
//-------------------------------------------------------------------------------------
inline ifloat_t ifloat_init(int32_t a)
{
return (int64_t)(a)<< IFLOAT_SHIFT;
}
//-------------------------------------------------------------------------------------
inline float32_t ifloat_get_float(ifloat_t a)
{
return (float32_t)((float64_t)a/ IFLOAT_SCALE);
}
//-------------------------------------------------------------------------------------
inline ifloat_t ifloat_multiply(ifloat_t a, ifloat_t b)
{
return (ifloat_t)((a * b) >> IFLOAT_SHIFT);
}
//-------------------------------------------------------------------------------------
//inline void ifloat3_add(ifloat3_t& a, const ifloat3_t& b)
//{
// a[0] += b[0]; a[1] += b[1]; a[2] += b[2];
//}
//-------------------------------------------------------------------------------------
//inline void ifloat3_sub(ifloat3_t& a, const ifloat3_t& b)
//{
// a[0] -= b[0]; a[1] -= b[1]; a[2] -= b[2];
//}
//-------------------------------------------------------------------------------------
//inline void ifloat3_cpy(ifloat3_t& a, const ifloat3_t& b)
//{
// a[0] = b[0]; a[1] = b[1]; a[2] = b[2];
//}
//-------------------------------------------------------------------------------------
struct ifloat2_t
{
ifloat_t x, y;
ifloat2_t() : x(0ll), y(0ll) {}
ifloat2_t(const ifloat2_t& other) : x(other.x), y(other.y) {}
ifloat2_t(float32_t _x, float32_t _y) : x(ifloat_init(_x)), y(ifloat_init(_y)) {}
};
struct ifloat3_t
{
ifloat_t x, y, z;
inline void add(const ifloat3_t& other) {
x += other.x;
y += other.y;
z += other.z;
}
inline void sub(const ifloat3_t& other) {
x -= other.x;
y -= other.y;
z -= other.z;
}
inline ifloat_t operator [] (const size_t i) const {
return *(&x + i);
}
inline ifloat_t& operator [] (const size_t i) {
return *(&x + i);
}
ifloat3_t() : x(0ll), y(0ll), z(0ll) {}
ifloat3_t(const ifloat3_t& other) : x(other.x), y(other.y), z(other.z) {}
ifloat3_t(float32_t _x, float32_t _y, float32_t _z) : x(ifloat_init(_x)), y(ifloat_init(_y)), z(ifloat_init(_z)) {}
ifloat3_t(ifloat_t _x, ifloat_t _y, ifloat_t _z) : x(_x), y(_y), z(_z) {}
};
DV_CORE_END_NAMESPACE
+141
View File
@@ -0,0 +1,141 @@
#pragma once
#include "dvc_config.h"
#include "dvc_pre_declare.h"
DV_CORE_BEGIN_NAMESPACE
class MathUtil
{
public:
static size_t ComponentSize(ComponentType ct);
static size_t DataTypeSize(DataType dt);
static bool floatEqual(float a, float b,
float tolerance = std::numeric_limits<float>::epsilon()) {
return std::abs(b - a) <= tolerance;
}
//Square root function.
static float sqrt(float f) {
return std::sqrt(f);
}
//min
template<typename V>
static V min2(const V& v1, const V& v2) {
return (v1 < v2) ? v1 : v2;
}
template<typename V>
static V min3(const V& v1, const V& v2, const V& v3) {
return (v1 < v2) ? ((v1 < v3) ? v1 : v3) : ((v2 < v3) ? v2 : v3);
}
//max
template<typename V>
static V max2(const V& v1, const V& v2) {
return (v1 > v2) ? v1 : v2;
}
template<typename V>
static V max3(const V& v1, const V& v2, const V& v3) {
return (v1 > v2) ? ((v1 > v3) ? v1 : v3) : ((v2 > v3) ? v2 : v3);
}
/* Simulate the shader function lerp which performers linear interpolation
given 3 parameters v0, v1 and t the function returns the value of (1 - t)* v0 + t * v1.
where v0 and v1 are matching vector or scalar types and t can be either a scalar or a
vector of the same type as a and b.
*/
template <typename V, typename T>
static V lerp(const V& v0, const V& v1, const T& t) {
return v0 * (1 - t) + v1 * t;
}
template <typename V, typename T>
static V lerp3(const V& v0, const V& v1, const V& v2, const T& t) {
return v0 * t[0] + v1 * t[1] + v2 * t[2];
}
// A random number in the range from [0,1]
static float DV_CORE_API unitRandom(void);
// A random number in the range from [low, high].
static float rangeRandom(float low, float high) {
return (high - low)*unitRandom() + low;
}
static int32_t rangeRandom(int32_t low, int32_t high) {
return ((high - low) >= RAND_MAX) ? ((rand()<<16|rand()) % (high - low) + low) : (rand() % (high - low) + low);
}
//clamps the specified value within the range of min to max.
template <typename T>
static T saturate(T v, const T& min=(T)0, const T& max=(T)1) {
return (v < min) ? min : ((v > max) ? max : v);
}
//cosine function
static float cos(float a) {
return std::cos(a);
}
//Sine function
static float sin(float a) {
return std::sin(a);
}
//return a right-handed, look-at matrix.
template<typename T>
static TMatrix4<T> lookatRH(const TVector3<T>& eye, const TVector3<T>& lookat, const TVector3<T>& up);
//return a right-handed perspective projection matrix based on a field of view.
template<typename T>
static TMatrix4<T> perspectiveFovRH(T fov, T aspect, T zNear, T zFar);
static DV_CORE_API const float POS_INFINITY;
static DV_CORE_API const float NEG_INFINITY;
static DV_CORE_API const float PI;
static DV_CORE_API const float PI_X2;
static DV_CORE_API const float PI_DIV2;
static DV_CORE_API const float PI_DIV4;
static DV_CORE_API const float fDeg2Rad;
static DV_CORE_API const float fRad2Deg;
};
//-------------------------------------------------------------------------------------
template<typename T>
TMatrix4<T> MathUtil::lookatRH(const TVector3<T>& eye, const TVector3<T>& lookat, const TVector3<T>& up)
{
assert(lookat != eye);
assert(up != TVector3<T>::ZERO);
TVector3<T> zaxis = (eye - lookat).normalise();
TVector3<T> xaxis = up.crossProduct(zaxis).normalise();
TVector3<T> yaxis = zaxis.crossProduct(xaxis).normalise();
return TMatrix4<T>(
xaxis.x, xaxis.y, xaxis.z, -xaxis.dotProduct(eye),
yaxis.x, yaxis.y, yaxis.z, -yaxis.dotProduct(eye),
zaxis.x, zaxis.y, zaxis.z, -zaxis.dotProduct(eye),
0, 0, 0, 1.f);
}
//-------------------------------------------------------------------------------------
template<typename T>
TMatrix4<T> MathUtil::perspectiveFovRH(T fov, T aspect, T zNear, T zFar)
{
assert(zNear > T(0) && zFar > T(0));
assert(!MathUtil::floatEqual(fov, T(0), T(0.00001) * 2));
assert(!MathUtil::floatEqual(aspect, T(0), T(0.00001)));
assert(!MathUtil::floatEqual(zNear, zFar, T(0.00001)));
T cotanHalfFovy = T(1.0) / tanf(fov * T(0.5));
return TMatrix4<T>(
cotanHalfFovy / aspect, 0, 0, 0,
0, cotanHalfFovy, 0, 0,
0, 0, -zFar / (zFar - zNear), -(zFar * zNear) / (zFar - zNear),
0, 0, T(-1), 0
);
}
DV_CORE_END_NAMESPACE
+294
View File
@@ -0,0 +1,294 @@
#pragma once
#include "dvc_config.h"
#include "dvc_pre_declare.h"
DV_CORE_BEGIN_NAMESPACE
template<typename T>
class TMatrix3
{
protected:
/* The matrix entries, indexed by [row][col].
| m[0][0] m[0][1] m[0][2] |
| m[1][0] m[1][1] m[1][2] |
| m[2][0] m[2][1] m[2][2] |
*/
union {
T m[3][3];
T _m[9];
};
public:
// constructor, It does NOT initialize the matrix for efficiency.
TMatrix3() {}
inline explicit TMatrix3(const T arr[3][3]) {
memcpy(m, arr, 9 * sizeof(T));
}
inline TMatrix3(const TMatrix3& rkMatrix) {
memcpy(m, rkMatrix.m, 9 * sizeof(T));
}
TMatrix3(
T m00, T m01, T m02,
T m10, T m11, T m12,
T m20, T m21, T m22)
{
m[0][0] = m00; m[0][1] = m01; m[0][2] = m02;
m[1][0] = m10; m[1][1] = m11; m[1][2] = m12;
m[2][0] = m20; m[2][1] = m21; m[2][2] = m22;
}
public:
inline const T* operator[] (size_t iRow) const {
assert(iRow < 3);
return m[iRow];
}
inline T* operator[] (size_t iRow) {
assert(iRow < 3);
return m[iRow];
}
public:
// Operations
inline TMatrix3& operator = (const TMatrix3& rkMatrix) {
memcpy(m, rkMatrix.m, 9 * sizeof(T));
return *this;
}
bool operator == (const TMatrix3& rkMatrix) const;
inline bool operator != (const TMatrix3& rkMatrix) const {
return !operator==(rkMatrix);
}
// return this + rkMatrix
TMatrix3 operator + (const TMatrix3& rkMatrix) const;
// return this - Matrix
TMatrix3 operator - (const TMatrix3& rkMatrix) const;
// return this * rkMatrix
TMatrix3 operator * (const TMatrix3& rkMatrix) const;
// return -this
TMatrix3 operator - () const;
/* Matrix * Vector
| m[0][0] m[0][1] m[0][2] | |x|
| m[1][0] m[1][1] m[1][2] | * |y|
| m[2][0] m[2][1] m[2][2] | |z|
*/
TVector3<T> operator * (const TVector3<T>& rkVector) const;
/* Vector * Matrix
| m[0][0] m[0][1] m[0][2] |
[x, y, z] * | m[1][0] m[1][1] m[1][2] |
| m[2][0] m[2][1] m[2][2] |
*/
template<typename U>
friend TVector3<U> operator * (const TVector3<U>& rkVector, const TMatrix3<U>& rkMatrix);
/// Matrix * scalar
TMatrix3 operator * (T fScalar) const;
/// Scalar * matrix
template<typename U>
friend TMatrix3<U> operator * (U fScalar, const TMatrix3<U>& rkMatrix);
public:
// Utilities
//return this^T
TMatrix3 transpose(void) const;
//rkInverse = this^{-1}?? return false mean no solution
bool inverse(TMatrix3& rkInverse, T fTolerance = 1e-06f) const;
//return this^{-1}, return ZERO if no solution
TMatrix3 inverse(T fTolerance = 1e-06f) const;
public:
static DV_CORE_API const TMatrix3 ZERO;
static DV_CORE_API const TMatrix3 IDENTITY;
};
//-------------------------------------------------------------------------------------
template<typename T>
bool TMatrix3<T>::operator== (const TMatrix3<T>& rkMatrix) const
{
for (size_t iRow = 0; iRow < 3; iRow++) {
for (size_t iCol = 0; iCol < 3; iCol++) {
if (m[iRow][iCol] != rkMatrix.m[iRow][iCol])
return false;
}
}
return true;
}
//-------------------------------------------------------------------------------------
template<typename T>
TMatrix3<T> TMatrix3<T>::operator + (const TMatrix3<T>& rkMatrix) const
{
TMatrix3<T> kSum;
for (size_t iRow = 0; iRow < 3; iRow++) {
for (size_t iCol = 0; iCol < 3; iCol++) {
kSum.m[iRow][iCol] = m[iRow][iCol] + rkMatrix.m[iRow][iCol];
}
}
return kSum;
}
//-------------------------------------------------------------------------------------
template<typename T>
TMatrix3<T> TMatrix3<T>::operator - (const TMatrix3<T>& rkMatrix) const
{
TMatrix3<T> kDiff;
for (size_t iRow = 0; iRow < 3; iRow++) {
for (size_t iCol = 0; iCol < 3; iCol++) {
kDiff.m[iRow][iCol] = m[iRow][iCol] - rkMatrix.m[iRow][iCol];
}
}
return kDiff;
}
//-------------------------------------------------------------------------------------
template<typename T>
TMatrix3<T> TMatrix3<T>::operator * (const TMatrix3<T>& rkMatrix) const
{
TMatrix3<T> kProd;
for (size_t iRow = 0; iRow < 3; iRow++) {
for (size_t iCol = 0; iCol < 3; iCol++) {
kProd.m[iRow][iCol] =
m[iRow][0] * rkMatrix.m[0][iCol] +
m[iRow][1] * rkMatrix.m[1][iCol] +
m[iRow][2] * rkMatrix.m[2][iCol];
}
}
return kProd;
}
//-------------------------------------------------------------------------------------
template<typename T>
TMatrix3<T> TMatrix3<T>::operator - () const
{
TMatrix3<T> kNeg;
for (size_t i = 0; i < 9; i++) {
kNeg._m[i] = -_m[i];
}
return kNeg;
}
//-------------------------------------------------------------------------------------
template<typename T>
TVector3<T> TMatrix3<T>::operator* (const TVector3<T>& rkPoint) const
{
TVector3<T> kProd(
m[0][0] * rkPoint[0] + m[0][1] * rkPoint[1] + m[0][2] * rkPoint[2],
m[1][0] * rkPoint[0] + m[1][1] * rkPoint[1] + m[1][2] * rkPoint[2],
m[2][0] * rkPoint[0] + m[2][1] * rkPoint[1] + m[2][2] * rkPoint[2]);
return kProd;
}
//-------------------------------------------------------------------------------------
template<typename T>
inline TVector3<T> operator* (const TVector3<T>& rkPoint, const TMatrix3<T>& rkMatrix)
{
TVector3<T> kProd(
rkPoint[0] * rkMatrix.m[0][0] + rkPoint[1] * rkMatrix.m[1][0] + rkPoint[2] * rkMatrix.m[2][0],
rkPoint[0] * rkMatrix.m[0][1] + rkPoint[1] * rkMatrix.m[1][1] + rkPoint[2] * rkMatrix.m[2][1],
rkPoint[0] * rkMatrix.m[0][2] + rkPoint[1] * rkMatrix.m[1][2] + rkPoint[2] * rkMatrix.m[2][2]);
return kProd;
}
//-------------------------------------------------------------------------------------
template<typename T>
TMatrix3<T> TMatrix3<T>::operator* (T fScalar) const
{
TMatrix3<T> kProd;
for (size_t iRow = 0; iRow < 3; iRow++) {
for (size_t iCol = 0; iCol < 3; iCol++)
kProd[iRow][iCol] = fScalar * m[iRow][iCol];
}
return kProd;
}
//-------------------------------------------------------------------------------------
template<typename T>
TMatrix3<T> operator* (T fScalar, const TMatrix3<T>& rkMatrix)
{
TMatrix3<T> kProd;
for (size_t iRow = 0; iRow < 3; iRow++) {
for (size_t iCol = 0; iCol < 3; iCol++)
kProd[iRow][iCol] = fScalar * rkMatrix.m[iRow][iCol];
}
return kProd;
}
//-------------------------------------------------------------------------------------
template<typename T>
TMatrix3<T> TMatrix3<T>::transpose(void) const
{
TMatrix3<T> kTranspose;
for (size_t iRow = 0; iRow < 3; iRow++) {
for (size_t iCol = 0; iCol < 3; iCol++)
kTranspose[iRow][iCol] = m[iCol][iRow];
}
return kTranspose;
}
//-------------------------------------------------------------------------------------
template<typename T>
bool TMatrix3<T>::inverse(TMatrix3<T>& rkInverse, T fTolerance) const
{
// Invert a 3x3 using cofactors. This is about 8 times faster than
// the Numerical Recipes code which uses Gaussian elimination.
rkInverse[0][0] = m[1][1] * m[2][2] -
m[1][2] * m[2][1];
rkInverse[0][1] = m[0][2] * m[2][1] -
m[0][1] * m[2][2];
rkInverse[0][2] = m[0][1] * m[1][2] -
m[0][2] * m[1][1];
rkInverse[1][0] = m[1][2] * m[2][0] -
m[1][0] * m[2][2];
rkInverse[1][1] = m[0][0] * m[2][2] -
m[0][2] * m[2][0];
rkInverse[1][2] = m[0][2] * m[1][0] -
m[0][0] * m[1][2];
rkInverse[2][0] = m[1][0] * m[2][1] -
m[1][1] * m[2][0];
rkInverse[2][1] = m[0][1] * m[2][0] -
m[0][0] * m[2][1];
rkInverse[2][2] = m[0][0] * m[1][1] -
m[0][1] * m[1][0];
T fDet =
m[0][0] * rkInverse[0][0] +
m[0][1] * rkInverse[1][0] +
m[0][2] * rkInverse[2][0];
if (std::abs(fDet) <= fTolerance)
return false;
T fInvDet = T(1.0) / fDet;
for (size_t iRow = 0; iRow < 3; iRow++) {
for (size_t iCol = 0; iCol < 3; iCol++)
rkInverse[iRow][iCol] *= fInvDet;
}
return true;
}
//-------------------------------------------------------------------------------------
template<typename T>
TMatrix3<T> TMatrix3<T>::inverse(T fTolerance) const
{
TMatrix3<T> kInverse = TMatrix3<T>::ZERO;
inverse(kInverse, fTolerance);
return kInverse;
}
typedef TMatrix3<float32_t> fMatrix3;
DV_CORE_END_NAMESPACE
+463
View File
@@ -0,0 +1,463 @@
#pragma once
#include "dvc_config.h"
#include "dvc_pre_declare.h"
DV_CORE_BEGIN_NAMESPACE
template<typename T>
class TMatrix4
{
protected:
/*
| m[0][0] m[0][1] m[0][2] m[0][3] |
| m[1][0] m[1][1] m[1][2] m[1][3] |
| m[2][0] m[2][1] m[2][2] m[2][3] |
| m[3][0] m[3][1] m[3][2] m[3][3] |
*/
union {
T m[4][4];
T _m[16];
};
public:
// constructor, It does NOT initialize the matrix for efficiency.
TMatrix4() {}
inline explicit TMatrix4(const T arr[4][4]) {
memcpy(m, arr, 16 * sizeof(T));
}
inline TMatrix4(const TMatrix4& rkMatrix) {
memcpy(m, rkMatrix.m, 16 * sizeof(T));
}
TMatrix4(
T m00, T m01, T m02, T m03,
T m10, T m11, T m12, T m13,
T m20, T m21, T m22, T m23,
T m30, T m31, T m32, T m33)
{
m[0][0] = m00; m[0][1] = m01; m[0][2] = m02; m[0][3] = m03;
m[1][0] = m10; m[1][1] = m11; m[1][2] = m12; m[1][3] = m13;
m[2][0] = m20; m[2][1] = m21; m[2][2] = m22; m[2][3] = m23;
m[3][0] = m30; m[3][1] = m31; m[3][2] = m32; m[3][3] = m33;
}
public:
inline const T* operator[] (size_t iRow) const {
assert(iRow < 4);
return m[iRow];
}
inline T* operator[] (size_t iRow) {
assert(iRow < 4);
return m[iRow];
}
public:
// Operators
inline TMatrix4& operator = (const TMatrix4& rkMatrix) {
memcpy(m, rkMatrix.m, 16 * sizeof(T));
return *this;
}
bool operator == (const TMatrix4& rkMatrix) const;
inline bool operator != (const TMatrix4& rkMatrix) const {
return !operator==(rkMatrix);
}
// return this + m2
TMatrix4 operator + (const TMatrix4 &m2) const;
// return this - m2
TMatrix4 operator - (const TMatrix4 &m2) const;
//return this * m2
TMatrix4 operator * (const TMatrix4 &m2) const;
//return this * scalar
inline TMatrix4 operator*(T scalar) const {
return TMatrix4(
scalar*m[0][0], scalar*m[0][1], scalar*m[0][2], scalar*m[0][3],
scalar*m[1][0], scalar*m[1][1], scalar*m[1][2], scalar*m[1][3],
scalar*m[2][0], scalar*m[2][1], scalar*m[2][2], scalar*m[2][3],
scalar*m[3][0], scalar*m[3][1], scalar*m[3][2], scalar*m[3][3]);
}
/// return scalar * matrix
friend TMatrix4 operator* (T scalar, const TMatrix4& rkMatrix) {
return TMatrix4(
scalar*rkMatrix[0][0], scalar*rkMatrix[0][1], scalar*rkMatrix[0][2], scalar*rkMatrix[0][3],
scalar*rkMatrix[1][0], scalar*rkMatrix[1][1], scalar*rkMatrix[1][2], scalar*rkMatrix[1][3],
scalar*rkMatrix[2][0], scalar*rkMatrix[2][1], scalar*rkMatrix[2][2], scalar*rkMatrix[2][3],
scalar*rkMatrix[3][0], scalar*rkMatrix[3][1], scalar*rkMatrix[3][2], scalar*rkMatrix[3][3]);
}
// return -this
TMatrix4 operator - () const {
return TMatrix4(
-m[0][0], -m[0][1], -m[0][2], -m[0][3],
-m[1][0], -m[1][1], -m[1][2], -m[1][3],
-m[2][0], -m[2][1], -m[2][2], -m[2][3],
-m[3][0], -m[3][1], -m[3][2], -m[3][3]);
}
/* return Matrix * fVector4
| m[0][0] m[0][1] m[0][2] m[0][3] | |x|
| m[1][0] m[1][1] m[1][2] m[1][3] | * |y|
| m[2][0] m[2][1] m[2][2] m[2][3] | |z|
| m[3][0] m[3][1] m[3][2] m[3][3] | |w|
*/
inline TVector4<T> operator * (const TVector4<T>& v) const {
return TVector4<T>(
(m[0][0] * v.x + m[0][1] * v.y) + (m[0][2] * v.z + m[0][3] * v.w),
(m[1][0] * v.x + m[1][1] * v.y) + (m[1][2] * v.z + m[1][3] * v.w),
(m[2][0] * v.x + m[2][1] * v.y) + (m[2][2] * v.z + m[2][3] * v.w),
(m[3][0] * v.x + m[3][1] * v.y) + (m[3][2] * v.z + m[3][3] * v.w)
);
}
/*
Transforms the given 3-D vector by the matrix, projecting the
result back into <i>w</i> = 1.
@note
This means that the initial <i>w</i> is considered to be 1.0,
and then all the tree elements of the resulting 3-D vector are
divided by the resulting <i>w</i>.
*/
inline TVector3<T> operator * (const TVector3<T> &v) const {
TVector3<T> r;
T fInvW = 1.0f / (m[3][0] * v.x + m[3][1] * v.y + m[3][2] * v.z + m[3][3]);
r.x = (m[0][0] * v.x + m[0][1] * v.y + m[0][2] * v.z + m[0][3]) * fInvW;
r.y = (m[1][0] * v.x + m[1][1] * v.y + m[1][2] * v.z + m[1][3]) * fInvW;
r.z = (m[2][0] * v.x + m[2][1] * v.y + m[2][2] * v.z + m[2][3]) * fInvW;
return r;
}
/* return fVector4 * Matrix
| m[0][0] m[0][1] m[0][2] m[0][3] |
[x,y,z,w] * | m[1][0] m[1][1] m[1][2] m[1][3] |
| m[2][0] m[2][1] m[2][2] m[2][3] |
| m[3][0] m[3][1] m[3][2] m[3][3] |
*/
friend TVector4<T> operator * (const TVector4<T>& v, const TMatrix4& mat) {
return TVector4<T>(
(v.x*mat[0][0] + v.y*mat[1][0]) + (v.z*mat[2][0] + v.w*mat[3][0]),
(v.x*mat[0][1] + v.y*mat[1][1]) + (v.z*mat[2][1] + v.w*mat[3][1]),
(v.x*mat[0][2] + v.y*mat[1][2]) + (v.z*mat[2][2] + v.w*mat[3][2]),
(v.x*mat[0][3] + v.y*mat[1][3]) + (v.z*mat[2][3] + v.w*mat[3][3])
);
}
friend TVector3<T> operator * (const TVector3<T>& v, const TMatrix4& mat) {
TVector3<T> r;
T fInvW = 1.0f / (mat.m[0][3] * v.x + mat.m[1][3] * v.y + mat.m[2][3] * v.z + mat.m[3][3]);
r.x = (mat.m[0][0] * v.x + mat.m[1][0] * v.y + mat.m[2][0] * v.z + mat.m[3][0]) * fInvW;
r.y = (mat.m[0][1] * v.x + mat.m[1][1] * v.y + mat.m[2][1] * v.z + mat.m[3][1]) * fInvW;
r.z = (mat.m[0][2] * v.x + mat.m[1][2] * v.y + mat.m[2][2] * v.z + mat.m[3][2]) * fInvW;
return r;
}
public:
static inline TMatrix4 makeTrans(T x, T y, T z) {
return TMatrix4(
1, 0, 0, x,
0, 1, 0, y,
0, 0, 1, z,
0, 0, 0, 1);
}
static inline TMatrix4 makeTrans(const TVector3<T>& pos) {
return TMatrix4(
1, 0, 0, pos.x,
0, 1, 0, pos.y,
0, 0, 1, pos.z,
0, 0, 0, 1);
}
static inline TMatrix4 makeScale(T x, T y, T z) {
return TMatrix4(
x, 0, 0, 0,
0, y, 0, 0,
0, 0, z, 0,
0, 0, 0, 1);
}
//rotate matrix(x), left multiplication
static inline TMatrix4 makeRotate_X(T angle) {
T s = sin(angle);
T c = cos(angle);
return TMatrix4(
1, 0, 0, 0,
0, c, -s, 0,
0, s, c, 0,
0, 0, 0, 1);
}
//rotate matrix(y), left multiplication
static inline TMatrix4 makeRotate_Y(T angle) {
T s = sin(angle);
T c = cos(angle);
return TMatrix4(
c, 0, s, 0,
0, 1, 0, 0,
-s, 0, c, 0,
0, 0, 0, 1);
}
//rotate matrix(z), left multiplication
static inline TMatrix4 makeRotate_Z(T angle) {
T s = sin(angle);
T c = cos(angle);
return TMatrix4(
c, -s, 0, 0,
s, c, 0, 0,
0, 0, 1, 0,
0, 0, 0, 1);
}
//rotate matrix(rotate angle about the v axis), left multiplication
static TMatrix4 makeRotate(const TVector3<T>& v, T angle) {
T c = cos(angle);
T s = sin(angle);
TMatrix4<T> result;
TVector3<T> axis = v.normalise();
result[0][0] = c + (T(1) - c) * axis.x * axis.x;
result[1][0] = (T(1) - c) * axis.x * axis.y + s * axis.z;
result[2][0] = (T(1) - c) * axis.x * axis.z - s * axis.y;
result[3][0] = T(0);
result[0][1] = (T(1) - c) * axis.y * axis.x - s * axis.z;
result[1][1] = c + (T(1) - c) * axis.y * axis.y;
result[2][1] = (T(1) - c) * axis.y * axis.z + s * axis.x;
result[3][1] = T(0);
result[0][2] = (T(1) - c) * axis.z * axis.x + s * axis.y;
result[1][2] = (T(1) - c) * axis.z * axis.y - s * axis.x;
result[2][2] = c + (T(1) - c) * axis.z * axis.z;
result[3][2] = T(0);
result[0][3] = 0;
result[1][3] = 0;
result[2][3] = 0;
result[3][3] = T(1);
return result;
}
//rotate matrix(from quaternion)
static TMatrix4 makeRotate(const TVector4<T>& q) {
TMatrix4<T> result;
T qxx(q.x * q.x);
T qyy(q.y * q.y);
T qzz(q.z * q.z);
T qxz(q.x * q.z);
T qxy(q.x * q.y);
T qyz(q.y * q.z);
T qwx(q.w * q.x);
T qwy(q.w * q.y);
T qwz(q.w * q.z);
result[0][0] = T(1) - T(2) * (qyy + qzz);
result[1][0] = T(2) * (qxy + qwz);
result[2][0] = T(2) * (qxz - qwy);
result[3][0] = 0;
result[0][1] = T(2) * (qxy - qwz);
result[1][1] = T(1) - T(2) * (qxx + qzz);
result[2][1] = T(2) * (qyz + qwx);
result[3][1] = 0;
result[0][2] = T(2) * (qxz + qwy);
result[1][2] = T(2) * (qyz - qwx);
result[2][2] = T(1) - T(2) * (qxx + qyy);
result[3][2] = 0;
result[0][3] = 0;
result[1][3] = 0;
result[2][3] = 0;
result[3][3] = T(1);
return result;
}
inline TMatrix4 transpose(void) const {
return TMatrix4(
m[0][0], m[1][0], m[2][0], m[3][0],
m[0][1], m[1][1], m[2][1], m[3][1],
m[0][2], m[1][2], m[2][2], m[3][2],
m[0][3], m[1][3], m[2][3], m[3][3]);
}
//return this^{-1}, return ZERO if no solution
TMatrix4 inverse(void) const;
public:
static DV_CORE_API const TMatrix4 ZERO;
static DV_CORE_API const TMatrix4 IDENTITY;
};
//-------------------------------------------------------------------------------------
template<typename T>
bool TMatrix4<T>::operator == (const TMatrix4<T>& m2) const {
if (
m[0][0] != m2.m[0][0] || m[0][1] != m2.m[0][1] || m[0][2] != m2.m[0][2] || m[0][3] != m2.m[0][3] ||
m[1][0] != m2.m[1][0] || m[1][1] != m2.m[1][1] || m[1][2] != m2.m[1][2] || m[1][3] != m2.m[1][3] ||
m[2][0] != m2.m[2][0] || m[2][1] != m2.m[2][1] || m[2][2] != m2.m[2][2] || m[2][3] != m2.m[2][3] ||
m[3][0] != m2.m[3][0] || m[3][1] != m2.m[3][1] || m[3][2] != m2.m[3][2] || m[3][3] != m2.m[3][3])
return false;
return true;
}
//-------------------------------------------------------------------------------------
template<typename T>
TMatrix4<T> TMatrix4<T>::operator * (const TMatrix4<T>& m2) const
{
TMatrix4<T> r;
r.m[0][0] = m[0][0] * m2.m[0][0] + m[0][1] * m2.m[1][0] + m[0][2] * m2.m[2][0] + m[0][3] * m2.m[3][0];
r.m[0][1] = m[0][0] * m2.m[0][1] + m[0][1] * m2.m[1][1] + m[0][2] * m2.m[2][1] + m[0][3] * m2.m[3][1];
r.m[0][2] = m[0][0] * m2.m[0][2] + m[0][1] * m2.m[1][2] + m[0][2] * m2.m[2][2] + m[0][3] * m2.m[3][2];
r.m[0][3] = m[0][0] * m2.m[0][3] + m[0][1] * m2.m[1][3] + m[0][2] * m2.m[2][3] + m[0][3] * m2.m[3][3];
r.m[1][0] = m[1][0] * m2.m[0][0] + m[1][1] * m2.m[1][0] + m[1][2] * m2.m[2][0] + m[1][3] * m2.m[3][0];
r.m[1][1] = m[1][0] * m2.m[0][1] + m[1][1] * m2.m[1][1] + m[1][2] * m2.m[2][1] + m[1][3] * m2.m[3][1];
r.m[1][2] = m[1][0] * m2.m[0][2] + m[1][1] * m2.m[1][2] + m[1][2] * m2.m[2][2] + m[1][3] * m2.m[3][2];
r.m[1][3] = m[1][0] * m2.m[0][3] + m[1][1] * m2.m[1][3] + m[1][2] * m2.m[2][3] + m[1][3] * m2.m[3][3];
r.m[2][0] = m[2][0] * m2.m[0][0] + m[2][1] * m2.m[1][0] + m[2][2] * m2.m[2][0] + m[2][3] * m2.m[3][0];
r.m[2][1] = m[2][0] * m2.m[0][1] + m[2][1] * m2.m[1][1] + m[2][2] * m2.m[2][1] + m[2][3] * m2.m[3][1];
r.m[2][2] = m[2][0] * m2.m[0][2] + m[2][1] * m2.m[1][2] + m[2][2] * m2.m[2][2] + m[2][3] * m2.m[3][2];
r.m[2][3] = m[2][0] * m2.m[0][3] + m[2][1] * m2.m[1][3] + m[2][2] * m2.m[2][3] + m[2][3] * m2.m[3][3];
r.m[3][0] = m[3][0] * m2.m[0][0] + m[3][1] * m2.m[1][0] + m[3][2] * m2.m[2][0] + m[3][3] * m2.m[3][0];
r.m[3][1] = m[3][0] * m2.m[0][1] + m[3][1] * m2.m[1][1] + m[3][2] * m2.m[2][1] + m[3][3] * m2.m[3][1];
r.m[3][2] = m[3][0] * m2.m[0][2] + m[3][1] * m2.m[1][2] + m[3][2] * m2.m[2][2] + m[3][3] * m2.m[3][2];
r.m[3][3] = m[3][0] * m2.m[0][3] + m[3][1] * m2.m[1][3] + m[3][2] * m2.m[2][3] + m[3][3] * m2.m[3][3];
return r;
}
//-------------------------------------------------------------------------------------
template<typename T>
TMatrix4<T> TMatrix4<T>::operator + (const TMatrix4<T>& m2) const
{
TMatrix4<T> r;
r.m[0][0] = m[0][0] + m2.m[0][0];
r.m[0][1] = m[0][1] + m2.m[0][1];
r.m[0][2] = m[0][2] + m2.m[0][2];
r.m[0][3] = m[0][3] + m2.m[0][3];
r.m[1][0] = m[1][0] + m2.m[1][0];
r.m[1][1] = m[1][1] + m2.m[1][1];
r.m[1][2] = m[1][2] + m2.m[1][2];
r.m[1][3] = m[1][3] + m2.m[1][3];
r.m[2][0] = m[2][0] + m2.m[2][0];
r.m[2][1] = m[2][1] + m2.m[2][1];
r.m[2][2] = m[2][2] + m2.m[2][2];
r.m[2][3] = m[2][3] + m2.m[2][3];
r.m[3][0] = m[3][0] + m2.m[3][0];
r.m[3][1] = m[3][1] + m2.m[3][1];
r.m[3][2] = m[3][2] + m2.m[3][2];
r.m[3][3] = m[3][3] + m2.m[3][3];
return r;
}
//-------------------------------------------------------------------------------------
template<typename T>
TMatrix4<T> TMatrix4<T>::operator - (const TMatrix4<T>& m2) const
{
TMatrix4<T> r;
r.m[0][0] = m[0][0] - m2.m[0][0];
r.m[0][1] = m[0][1] - m2.m[0][1];
r.m[0][2] = m[0][2] - m2.m[0][2];
r.m[0][3] = m[0][3] - m2.m[0][3];
r.m[1][0] = m[1][0] - m2.m[1][0];
r.m[1][1] = m[1][1] - m2.m[1][1];
r.m[1][2] = m[1][2] - m2.m[1][2];
r.m[1][3] = m[1][3] - m2.m[1][3];
r.m[2][0] = m[2][0] - m2.m[2][0];
r.m[2][1] = m[2][1] - m2.m[2][1];
r.m[2][2] = m[2][2] - m2.m[2][2];
r.m[2][3] = m[2][3] - m2.m[2][3];
r.m[3][0] = m[3][0] - m2.m[3][0];
r.m[3][1] = m[3][1] - m2.m[3][1];
r.m[3][2] = m[3][2] - m2.m[3][2];
r.m[3][3] = m[3][3] - m2.m[3][3];
return r;
}
//-------------------------------------------------------------------------------------
template<typename T>
TMatrix4<T> TMatrix4<T>::inverse(void) const
{
T m00 = m[0][0], m01 = m[0][1], m02 = m[0][2], m03 = m[0][3];
T m10 = m[1][0], m11 = m[1][1], m12 = m[1][2], m13 = m[1][3];
T m20 = m[2][0], m21 = m[2][1], m22 = m[2][2], m23 = m[2][3];
T m30 = m[3][0], m31 = m[3][1], m32 = m[3][2], m33 = m[3][3];
T v0 = m20 * m31 - m21 * m30;
T v1 = m20 * m32 - m22 * m30;
T v2 = m20 * m33 - m23 * m30;
T v3 = m21 * m32 - m22 * m31;
T v4 = m21 * m33 - m23 * m31;
T v5 = m22 * m33 - m23 * m32;
T t00 = +(v5 * m11 - v4 * m12 + v3 * m13);
T t10 = -(v5 * m10 - v2 * m12 + v1 * m13);
T t20 = +(v4 * m10 - v2 * m11 + v0 * m13);
T t30 = -(v3 * m10 - v1 * m11 + v0 * m12);
T invDet = 1 / (t00 * m00 + t10 * m01 + t20 * m02 + t30 * m03);
T d00 = t00 * invDet;
T d10 = t10 * invDet;
T d20 = t20 * invDet;
T d30 = t30 * invDet;
T d01 = -(v5 * m01 - v4 * m02 + v3 * m03) * invDet;
T d11 = +(v5 * m00 - v2 * m02 + v1 * m03) * invDet;
T d21 = -(v4 * m00 - v2 * m01 + v0 * m03) * invDet;
T d31 = +(v3 * m00 - v1 * m01 + v0 * m02) * invDet;
v0 = m10 * m31 - m11 * m30;
v1 = m10 * m32 - m12 * m30;
v2 = m10 * m33 - m13 * m30;
v3 = m11 * m32 - m12 * m31;
v4 = m11 * m33 - m13 * m31;
v5 = m12 * m33 - m13 * m32;
T d02 = +(v5 * m01 - v4 * m02 + v3 * m03) * invDet;
T d12 = -(v5 * m00 - v2 * m02 + v1 * m03) * invDet;
T d22 = +(v4 * m00 - v2 * m01 + v0 * m03) * invDet;
T d32 = -(v3 * m00 - v1 * m01 + v0 * m02) * invDet;
v0 = m21 * m10 - m20 * m11;
v1 = m22 * m10 - m20 * m12;
v2 = m23 * m10 - m20 * m13;
v3 = m22 * m11 - m21 * m12;
v4 = m23 * m11 - m21 * m13;
v5 = m23 * m12 - m22 * m13;
T d03 = -(v5 * m01 - v4 * m02 + v3 * m03) * invDet;
T d13 = +(v5 * m00 - v2 * m02 + v1 * m03) * invDet;
T d23 = -(v4 * m00 - v2 * m01 + v0 * m03) * invDet;
T d33 = +(v3 * m00 - v1 * m01 + v0 * m02) * invDet;
return TMatrix4<T>(
d00, d01, d02, d03,
d10, d11, d12, d13,
d20, d21, d22, d23,
d30, d31, d32, d33);
}
typedef TMatrix4<float32_t> fMatrix4;
DV_CORE_END_NAMESPACE
+239
View File
@@ -0,0 +1,239 @@
#pragma once
#include "dvc_config.h"
DV_CORE_BEGIN_NAMESPACE
template<typename T>
class TVector2
{
public:
T x, y;
public:
// Construct
TVector2() : x(0), y(0) { }
TVector2(T _x, T _y) : x(_x), y(_y){ }
inline explicit TVector2(const T s) : x(s), y(s) { }
inline explicit TVector2(const T f[2]) : x(f[0]), y(f[1]) { }
inline explicit TVector2(T* const f) : x(f[0]), y(f[1]) { }
inline explicit TVector2(const int32_t f[2]) : x((T)f[0]), y((T)f[1]) { }
public:
inline T operator [] (const size_t i) const {
assert(i < 2);
return *(&x + i);
}
inline T& operator [] (const size_t i) {
assert(i < 2);
return *(&x + i);
}
inline T* ptr(void) {
return &x;
}
inline const T* ptr(void) const {
return &x;
}
public:
// Operations
inline TVector2& operator = (const TVector2& rkVector) {
x = rkVector.x;
y = rkVector.y;
return *this;
}
inline TVector2& operator = (const T fScalar) {
x = fScalar;
y = fScalar;
return *this;
}
inline bool operator == (const TVector2& rkVector) const {
return (x == rkVector.x && y == rkVector.y);
}
inline bool operator != (const TVector2& rkVector) const {
return (x != rkVector.x || y != rkVector.y);
}
public:
// Arithmetic operations
inline TVector2 operator + (const TVector2& rkVector) const {
return TVector2( x + rkVector.x, y + rkVector.y);
}
inline TVector2 operator - (const TVector2& rkVector) const {
return TVector2( x - rkVector.x, y - rkVector.y);
}
inline TVector2 operator * (const T fScalar) const {
return TVector2( x * fScalar, y * fScalar);
}
inline TVector2 operator * (const TVector2& rhs) const {
return TVector2(x * rhs.x, y * rhs.y);
}
inline TVector2 operator / (const T fScalar) const {
assert(fScalar != 0.0);
return TVector2(x / fScalar, y / fScalar);
}
inline TVector2 operator / (const TVector2& rhs) const {
return TVector2( x / rhs.x, y / rhs.y);
}
inline const TVector2& operator + () const {
return *this;
}
inline TVector2 operator - () const {
return TVector2(-x, -y);
}
public:
// overloaded operators to help TVector2
inline friend TVector2 operator * (const T fScalar, const TVector2& rkVector) {
return TVector2(fScalar * rkVector.x, fScalar * rkVector.y);
}
inline friend TVector2 operator / (const T fScalar, const TVector2& rkVector) {
return TVector2( fScalar / rkVector.x, fScalar / rkVector.y);
}
inline friend TVector2 operator + (const TVector2& lhs, const T rhs) {
return TVector2( lhs.x + rhs, lhs.y + rhs);
}
inline friend TVector2 operator + (const T lhs, const TVector2& rhs) {
return TVector2( lhs + rhs.x, lhs + rhs.y);
}
inline friend TVector2 operator - (const TVector2& lhs, const T rhs) {
return TVector2( lhs.x - rhs, lhs.y - rhs);
}
inline friend TVector2 operator - (const T lhs, const TVector2& rhs) {
return TVector2( lhs - rhs.x, lhs - rhs.y);
}
public:
// arithmetic updates
inline TVector2& operator += (const TVector2& rkVector) {
x += rkVector.x;
y += rkVector.y;
return *this;
}
inline TVector2& operator += (const T fScaler) {
x += fScaler;
y += fScaler;
return *this;
}
inline TVector2& operator -= (const TVector2& rkVector) {
x -= rkVector.x;
y -= rkVector.y;
return *this;
}
inline TVector2& operator -= (const T fScaler) {
x -= fScaler;
y -= fScaler;
return *this;
}
inline TVector2& operator *= (const T fScalar) {
x *= fScalar;
y *= fScalar;
return *this;
}
inline TVector2& operator *= (const TVector2& rkVector) {
x *= rkVector.x;
y *= rkVector.y;
return *this;
}
inline TVector2& operator /= (const T fScalar) {
assert(fScalar != 0.0);
x /= fScalar;
y /= fScalar;
return *this;
}
inline TVector2& operator /= (const TVector2& rkVector) {
x /= rkVector.x;
y /= rkVector.y;
return *this;
}
inline bool operator < (const TVector2& rhs) const {
return (x < rhs.x && y < rhs.y);
}
inline bool operator > (const TVector2& rhs) const {
return (x > rhs.x && y > rhs.y);
}
public:
inline T length(void) const {
return MathUtil::sqrt(x * x + y * y);
}
inline T squaredLength(void) const {
return x * x + y * y;
}
inline T distance(const TVector2& rhs) const {
return (*this - rhs).length();
}
inline T squaredDistance(const TVector2& rhs) const {
return (*this - rhs).squaredLength();
}
inline T dotProduct(const TVector2& vec) const {
return x * vec.x + y * vec.y;
}
inline T crossProduct(const TVector2& rkVector) const {
return x * rkVector.y - y * rkVector.x;
}
inline TVector2& normalise(void) {
T fLength = length();
if (fLength > 0.0f) {
T invLength = T(1.0) / fLength;
x *= invLength;
y *= invLength;
}
return *this;
}
inline TVector2& saturate(void) {
x = MathUtil::saturate(x);
y = MathUtil::saturate(y);
return *this;
}
public:
// special points
static DV_CORE_API const TVector2 ZERO;
static DV_CORE_API const TVector2 ONE;
static DV_CORE_API const TVector2 UNIT_X;
static DV_CORE_API const TVector2 UNIT_Y;
static DV_CORE_API const TVector2 NEGATIVE_UNIT_X;
static DV_CORE_API const TVector2 NEGATIVE_UNIT_Y;
static DV_CORE_API const TVector2 UNIT_SCALE;
};
typedef TVector2<float32_t> fVector2;
DV_CORE_END_NAMESPACE
+289
View File
@@ -0,0 +1,289 @@
#pragma once
#include "dvc_config.h"
#include "dvc_pre_declare.h"
#include "dvc_math_util.h"
DV_CORE_BEGIN_NAMESPACE
template<typename T>
class TVector3
{
public:
T x, y, z;
public:
// Construct
TVector3() : x(0.), y(0.), z(0.) { }
TVector3(T _x, T _y, T _z) : x(_x), y(_y), z(_z){ }
TVector3(const TVector2<T>& _xy, T _z) : x(_xy.x), y(_xy.y), z(_z) { }
TVector3(T _x, const TVector2<T>& _yz) : x(_x), y(_yz.x), z(_yz.y) { }
inline explicit TVector3(const T s) : x(s), y(s), z(s) { }
inline explicit TVector3(const T f[3]) : x(f[0]), y(f[1]), z(f[2]) { }
inline explicit TVector3(T* const f) : x(f[0]), y(f[1]), z(f[2]) { }
inline explicit TVector3(const int32_t f[3]) : x((T)f[0]), y((T)f[1]), z((T)f[2]) {}
public:
inline T operator [] (const size_t i) const {
assert(i < 3);
return *(&x + i);
}
inline T& operator [] (const size_t i) {
assert(i < 3);
return *(&x + i);
}
inline T* ptr(void) {
return &x;
}
inline const T* ptr(void) const {
return &x;
}
inline TVector2<T> xy(void) const { return TVector2<T>(x, y); }
inline TVector2<T> xz(void) const { return TVector2<T>(x, z); }
inline TVector2<T> yz(void) const { return TVector2<T>(y, z); }
public:
// Operations
inline TVector3& operator = (const TVector3& rkVector) {
x = rkVector.x;
y = rkVector.y;
z = rkVector.z;
return *this;
}
inline TVector3& operator = (const T fScalar) {
x = fScalar;
y = fScalar;
z = fScalar;
return *this;
}
inline bool operator == (const TVector3& rkVector) const {
return (x == rkVector.x && y == rkVector.y && z == rkVector.z);
}
inline bool operator != (const TVector3& rkVector) const {
return (x != rkVector.x || y != rkVector.y || z != rkVector.z);
}
public:
// Arithmetic operations
inline TVector3 operator + (const TVector3& rkVector) const {
return TVector3( x + rkVector.x, y + rkVector.y, z + rkVector.z);
}
inline TVector3 operator - (const TVector3& rkVector) const {
return TVector3( x - rkVector.x, y - rkVector.y, z - rkVector.z);
}
inline TVector3 operator * (const T fScalar) const {
return TVector3( x * fScalar, y * fScalar, z * fScalar);
}
inline TVector3 operator * (const TVector3& rhs) const {
return TVector3(x * rhs.x, y * rhs.y, z * rhs.z);
}
inline TVector3 operator / (const T fScalar) const {
assert(fScalar != 0.0);
return TVector3(x / fScalar, y / fScalar, z / fScalar);
}
inline TVector3 operator / (const TVector3& rhs) const {
return TVector3( x / rhs.x, y / rhs.y, z / rhs.z);
}
inline const TVector3& operator + () const {
return *this;
}
inline TVector3 operator - () const {
return TVector3(-x, -y, -z);
}
public:
// overloaded operators to help TVector3
inline friend TVector3 operator * (const T fScalar, const TVector3& rkVector) {
return TVector3(fScalar * rkVector.x, fScalar * rkVector.y, fScalar * rkVector.z);
}
inline friend TVector3 operator / (const T fScalar, const TVector3& rkVector) {
return TVector3( fScalar / rkVector.x, fScalar / rkVector.y, fScalar / rkVector.z);
}
inline friend TVector3 operator + (const TVector3& lhs, const T rhs) {
return TVector3( lhs.x + rhs, lhs.y + rhs, lhs.z + rhs);
}
inline friend TVector3 operator + (const T lhs, const TVector3& rhs) {
return TVector3( lhs + rhs.x, lhs + rhs.y, lhs + rhs.z);
}
inline friend TVector3 operator - (const TVector3& lhs, const T rhs) {
return TVector3( lhs.x - rhs, lhs.y - rhs, lhs.z - rhs);
}
inline friend TVector3 operator - (const T lhs, const TVector3& rhs) {
return TVector3( lhs - rhs.x, lhs - rhs.y, lhs - rhs.z);
}
inline friend TVector3 reflect(const TVector3& incident, const TVector3& normal) {
return incident - 2.f * normal.dotProduct(incident) * normal;
}
public:
// arithmetic updates
inline TVector3& operator += (const TVector3& rkVector) {
x += rkVector.x;
y += rkVector.y;
z += rkVector.z;
return *this;
}
inline TVector3& operator += (const T fScaler) {
x += fScaler;
y += fScaler;
z += fScaler;
return *this;
}
inline TVector3& operator -= (const TVector3& rkVector) {
x -= rkVector.x;
y -= rkVector.y;
z -= rkVector.z;
return *this;
}
inline TVector3& operator -= (const T fScaler) {
x -= fScaler;
y -= fScaler;
z -= fScaler;
return *this;
}
inline TVector3& operator *= (const T fScalar) {
x *= fScalar;
y *= fScalar;
z *= fScalar;
return *this;
}
inline TVector3& operator *= (const TVector3& rkVector) {
x *= rkVector.x;
y *= rkVector.y;
z *= rkVector.z;
return *this;
}
inline TVector3& operator /= (const T fScalar) {
assert(fScalar != 0.0);
x /= fScalar;
y /= fScalar;
z /= fScalar;
return *this;
}
inline TVector3& operator /= (const TVector3& rkVector) {
x /= rkVector.x;
y /= rkVector.y;
z /= rkVector.z;
return *this;
}
inline bool operator < (const TVector3& rhs) const {
return (x < rhs.x && y < rhs.y && z < rhs.z);
}
inline bool operator > (const TVector3& rhs) const {
return (x > rhs.x && y > rhs.y && z > rhs.z);
}
public:
inline T length(void) const {
return MathUtil::sqrt(x * x + y * y + z * z);
}
inline T squaredLength(void) const {
return x * x + y * y + z * z;
}
inline T distance(const TVector3& rhs) const {
return (*this - rhs).length();
}
inline T squaredDistance(const TVector3& rhs) const {
return (*this - rhs).squaredLength();
}
inline T dotProduct(const TVector3& vec) const {
return x * vec.x + y * vec.y + z * vec.z;
}
inline TVector3 crossProduct(const TVector3& rkVector) const {
return TVector3(
y * rkVector.z - z * rkVector.y,
z * rkVector.x - x * rkVector.z,
x * rkVector.y - y * rkVector.x);
}
inline TVector3& normalise(void) {
T fLength = length();
if (fLength > 0.0f) {
T invLength = 1.f / fLength;
x *= invLength;
y *= invLength;
z *= invLength;
}
return *this;
}
inline TVector3 normalise(void) const {
TVector3 result(x,y,z);
T fLength = length();
if (fLength > 0.0f) {
T invLength = 1.f / fLength;
result.x *= invLength;
result.y *= invLength;
result.z *= invLength;
}
return result;
}
inline TVector3& saturate(void) {
x = MathUtil::saturate(x);
y = MathUtil::saturate(y);
z = MathUtil::saturate(z);
return *this;
}
public:
// special points
static DV_CORE_API const TVector3 ZERO;
static DV_CORE_API const TVector3 ONE;
static DV_CORE_API const TVector3 UNIT_X;
static DV_CORE_API const TVector3 UNIT_Y;
static DV_CORE_API const TVector3 UNIT_Z;
static DV_CORE_API const TVector3 NEGATIVE_UNIT_X;
static DV_CORE_API const TVector3 NEGATIVE_UNIT_Y;
static DV_CORE_API const TVector3 NEGATIVE_UNIT_Z;
static DV_CORE_API const TVector3 UNIT_SCALE;
static DV_CORE_API const TVector3 WHITE;
static DV_CORE_API const TVector3 BLACK;
static DV_CORE_API const TVector3 RED;
static DV_CORE_API const TVector3 GREEN;
static DV_CORE_API const TVector3 BLUE;
static DV_CORE_API const TVector3 PURPLE;
static DV_CORE_API const TVector3 GRAY;
};
typedef TVector3<float32_t> fVector3;
DV_CORE_END_NAMESPACE
+249
View File
@@ -0,0 +1,249 @@
#pragma once
#include "dvc_config.h"
#include "dvc_pre_declare.h"
DV_CORE_BEGIN_NAMESPACE
template<typename T>
class TVector4
{
public:
T x, y, z, w;
public:
// Construct
TVector4() : x(0.f), y(0.f), z(0.f), w(0.f) { }
TVector4(T _x, T _y, T _z, T _w) : x(_x), y(_y), z(_z), w(_w){ }
TVector4(const TVector3<T>& _xyz, T _w) : x(_xyz.x), y(_xyz.y), z(_xyz.z), w(_w) { }
inline explicit TVector4(const T s) : x(s), y(s), z(s), w(s) { }
inline explicit TVector4(const T f[4]) : x(f[0]), y(f[1]), z(f[2]), w(f[3]) { }
inline explicit TVector4(T* const f) : x(f[0]), y(f[1]), z(f[2]), w(f[3]) { }
inline explicit TVector4(const int32_t f[4]) : x((T)f[0]), y((T)f[1]), z((T)f[2]), w((T)f[3]) { }
//inline explicit TVector4(const uint8_t* f)
// : x((T)(f[0] / T(std::numeric_limits<uint8_t>::max())))
// , y((T)(f[1] / T(std::numeric_limits<uint8_t>::max())))
// , z((T)(f[2] / T(std::numeric_limits<uint8_t>::max())))
// , w((T)(f[3] / T(std::numeric_limits<uint8_t>::max())))
//{
//}
//inline explicit TVector4(const uint16_t* f)
// : x((T)(f[0] / T(std::numeric_limits<uint16_t>::max())))
// , y((T)(f[1] / T(std::numeric_limits<uint16_t>::max())))
// , z((T)(f[2] / T(std::numeric_limits<uint16_t>::max())))
// , w((T)(f[3] / T(std::numeric_limits<uint16_t>::max())))
//{
//}
public:
inline T operator [] (const size_t i) const {
assert(i < 4);
return *(&x + i);
}
inline T& operator [] (const size_t i) {
assert(i < 4);
return *(&x + i);
}
inline T* ptr(void) {
return &x;
}
inline const T* ptr(void) const {
return &x;
}
inline TVector3<T> xyz(void) const { return TVector3<T>(x, y, z); }
public:
// Operations
inline TVector4& operator = (const TVector4& rkVector) {
x = rkVector.x;
y = rkVector.y;
z = rkVector.z;
w = rkVector.w;
return *this;
}
inline TVector4& operator = (const T fScalar) {
x = fScalar;
y = fScalar;
z = fScalar;
w = fScalar;
return *this;
}
inline bool operator == (const TVector4& rkVector) const {
return (x == rkVector.x && y == rkVector.y && z == rkVector.z && w == rkVector.w);
}
inline bool operator != (const TVector4& rkVector) const {
return (x != rkVector.x || y != rkVector.y || z != rkVector.z || w != rkVector.w);
}
public:
// Arithmetic operations
inline TVector4 operator + (const TVector4& rkVector) const {
return TVector4( x + rkVector.x, y + rkVector.y, z + rkVector.z, w + rkVector.w);
}
inline TVector4 operator - (const TVector4& rkVector) const {
return TVector4( x - rkVector.x, y - rkVector.y, z - rkVector.z, w - rkVector.w);
}
inline TVector4 operator * (const T fScalar) const {
return TVector4( x * fScalar, y * fScalar, z * fScalar, w * fScalar);
}
inline TVector4 operator * (const TVector4& rhs) const {
return TVector4(x * rhs.x, y * rhs.y, z * rhs.z, w * rhs.w);
}
inline TVector4 operator / (const T fScalar) const {
assert(fScalar != 0.0);
return TVector4(x / fScalar, y / fScalar, z / fScalar, w / fScalar);
}
inline TVector4 operator / (const TVector4& rhs) const {
return TVector4( x / rhs.x, y / rhs.y, z / rhs.z, w / rhs.w);
}
inline const TVector4& operator + () const {
return *this;
}
inline TVector4 operator - () const {
return TVector4(-x, -y, -z, -w);
}
public:
// overloaded operators to help TVector4
inline friend TVector4 operator * (const T fScalar, const TVector4& rkVector) {
return TVector4(fScalar * rkVector.x, fScalar * rkVector.y, fScalar * rkVector.z, fScalar * rkVector.w);
}
inline friend TVector4 operator / (const T fScalar, const TVector4& rkVector) {
return TVector4( fScalar / rkVector.x, fScalar / rkVector.y, fScalar / rkVector.z, fScalar / rkVector.w);
}
inline friend TVector4 operator + (const TVector4& lhs, const T rhs) {
return TVector4( lhs.x + rhs, lhs.y + rhs, lhs.z + rhs, lhs.w + rhs);
}
inline friend TVector4 operator + (const T lhs, const TVector4& rhs) {
return TVector4( lhs + rhs.x, lhs + rhs.y, lhs + rhs.z, lhs + rhs.w);
}
inline friend TVector4 operator - (const TVector4& lhs, const T rhs) {
return TVector4( lhs.x - rhs, lhs.y - rhs, lhs.z - rhs, lhs.w - rhs);
}
inline friend TVector4 operator - (const T lhs, const TVector4& rhs) {
return TVector4( lhs - rhs.x, lhs - rhs.y, lhs - rhs.z, lhs - rhs.z);
}
public:
// arithmetic updates
inline TVector4& operator += (const TVector4& rkVector) {
x += rkVector.x;
y += rkVector.y;
z += rkVector.z;
w += rkVector.w;
return *this;
}
inline TVector4& operator += (const T fScaler) {
x += fScaler;
y += fScaler;
z += fScaler;
w += fScaler;
return *this;
}
inline TVector4& operator -= (const TVector4& rkVector) {
x -= rkVector.x;
y -= rkVector.y;
z -= rkVector.z;
w -= rkVector.w;
return *this;
}
inline TVector4& operator -= (const T fScaler) {
x -= fScaler;
y -= fScaler;
z -= fScaler;
w -= fScaler;
return *this;
}
inline TVector4& operator *= (const T fScalar) {
x *= fScalar;
y *= fScalar;
z *= fScalar;
w *= fScalar;
return *this;
}
inline TVector4& operator *= (const TVector4& rkVector) {
x *= rkVector.x;
y *= rkVector.y;
z *= rkVector.z;
w *= rkVector.w;
return *this;
}
inline TVector4& operator /= (const T fScalar) {
assert(fScalar != 0.0);
x /= fScalar;
y /= fScalar;
z /= fScalar;
w /= fScalar;
return *this;
}
inline TVector4& operator /= (const TVector4& rkVector) {
x /= rkVector.x;
y /= rkVector.y;
z /= rkVector.z;
w /= rkVector.w;
return *this;
}
inline bool operator < (const TVector4& rhs) const {
return (x < rhs.x && y < rhs.y && z < rhs.z && w < rhs.w);
}
inline bool operator > (const TVector4& rhs) const {
return (x > rhs.x && y > rhs.y && z > rhs.z && w > rhs.w);
}
public:
inline T dotProduct(const TVector4& vec) const {
return (x * vec.x + y * vec.y) + (z * vec.z + w * vec.w);
}
inline TVector4& saturate(void) {
x = MathUtil::saturate(x);
y = MathUtil::saturate(y);
z = MathUtil::saturate(z);
w = MathUtil::saturate(w);
return *this;
}
public:
// special points
static DV_CORE_API const TVector4 ZERO;
static DV_CORE_API const TVector4 WHITE;
static DV_CORE_API const TVector4 BLACK;
static DV_CORE_API const TVector4 RED;
static DV_CORE_API const TVector4 GREEN;
static DV_CORE_API const TVector4 BLUE;
static DV_CORE_API const TVector4 PURPLE;
static DV_CORE_API const TVector4 GRAY;
};
typedef TVector4<float32_t> fVector4;
DV_CORE_END_NAMESPACE
+35
View File
@@ -0,0 +1,35 @@
#pragma once
#include "dvc_config.h"
#include "math/dvc_vector2.h"
#include "math/dvc_vector3.h"
DV_CORE_BEGIN_NAMESPACE
class DV_CORE_API Rasterizer
{
//Draw Line
public:
typedef std::function<void(const std::pair<int32_t, int32_t>&, float)> DrawLineCallback;
//Bresenham's line algorithm
static void drawLine(int32_t canvasWidth, int32_t canvasHeight,
const fVector2& start, const fVector2& end,
DrawLineCallback callback);
//Draw Triangle
public:
typedef std::function<void(const std::pair<int32_t, int32_t>& pos, const fVector3& percent)> DrawTriangleCallback;
//Larrabee algorithm
static void drawTriangleLarrabee(int32_t canvasWidth, int32_t canvasHeight,
const fVector2& v0, const fVector2& v1, const fVector2& v2,
DrawTriangleCallback callback, bool ccw=true);
//Scaleline algorithm
static void drawTriangleScanline(int32_t canvasWidth, int32_t canvasHeight,
const fVector3& v0, const fVector3& v1, const fVector3& v2,
DrawTriangleCallback callback);
};
DV_CORE_END_NAMESPACE
@@ -0,0 +1,30 @@
#pragma once
#include "dvc_config.h"
#include "scene/dvc_scene.h"
#include "device/dvc_render_target.h"
DV_CORE_BEGIN_NAMESPACE
class DV_CORE_API RenderQueue
{
public:
void pushRenderable(RenderableConstPtr renderable);
size_t getRenderableCounts() const {
return m_queue.size();
}
RenderableConstPtr getRenderable(size_t index) const;
void build(const Scene& scene);
void process(UniformBuffer& uniformBuffer, RenderTarget& renderTarget);
protected:
std::vector<RenderableConstPtr> m_queue;
public:
RenderQueue();
~RenderQueue();
};
DV_CORE_END_NAMESPACE
@@ -0,0 +1,35 @@
#pragma once
#include "dvc_config.h"
#include "math/dvc_matrix4.h"
#include "dvc_render_queue.h"
DV_CORE_BEGIN_NAMESPACE
class InputAssemberStep
{
public:
typedef std::map<VertexElementType, DeviceBufferAccessorConstPtr> PrimitiveAttributes;
struct Node
{
fMatrix4 transform;
PrimitiveType primitiveType;
PrimitiveAttributes vertexData;
DeviceBufferAccessorConstPtr indices;
VertexShaderInterface* vs;
};
typedef std::vector<Node> NodeArray;
public:
void process(const RenderQueue& renderQueue);
const NodeArray& getNodes(void) const {
return m_nodes;
}
protected:
NodeArray m_nodes;
};
DV_CORE_END_NAMESPACE
@@ -0,0 +1,15 @@
#pragma once
#include "dvc_config.h"
#include "dvc_render_step_VS.h"
DV_CORE_BEGIN_NAMESPACE
class PixelShaderStep
{
public:
void process(const VertexShaderStep::NodeArray& vsNodeArray, RenderTarget& renderTarget);
};
DV_CORE_END_NAMESPACE
@@ -0,0 +1,35 @@
#pragma once
#include "dvc_config.h"
#include "dvc_render_step_IA.h"
#include "device/dvc_uniform_buffer.h"
#include "device/dvc_vertex_desc.h"
DV_CORE_BEGIN_NAMESPACE
class VertexShaderStep
{
public:
struct Node
{
DeviceBufferPtr vertexBuf;
VertexDesc vertexDesc;
size_t vertexCounts;
std::vector<float32_t> depth;
std::vector<float32_t> invZ;
};
typedef std::vector<Node> NodeArray;
public:
const NodeArray& getNodes() const {
return m_nodes;
}
public:
void process(UniformBuffer& uniformBuffer, const InputAssemberStep::NodeArray& assembedNodeArray);
protected:
NodeArray m_nodes;
};
DV_CORE_END_NAMESPACE
+21
View File
@@ -0,0 +1,21 @@
#pragma once
#include "dvc_config.h"
#include "math/dvc_matrix4.h"
#include "pipe/dvc_render_step_IA.h"
DV_CORE_BEGIN_NAMESPACE
class Renderable
{
public:
virtual bool buildAssemberNode(InputAssemberStep::Node& node) const = 0;
protected:
fMatrix4 m_worldTransform;
public:
Renderable(const fMatrix4& worldTransform);
};
DV_CORE_END_NAMESPACE
@@ -0,0 +1,21 @@
#pragma once
#include "dvc_config.h"
#include "dvc_renderable.h"
#include "asset/dvc_mesh.h"
DV_CORE_BEGIN_NAMESPACE
class RenderableEntity : public Renderable
{
public:
virtual bool buildAssemberNode(InputAssemberStep::Node& node) const;
protected:
Mesh::PrimitiveConstPtr m_primitive;
public:
RenderableEntity(Mesh::PrimitiveConstPtr primitive, const fMatrix4& worldTransform);
};
DV_CORE_END_NAMESPACE
@@ -0,0 +1,52 @@
#pragma once
#include "dvc_component.h"
#include "math/dvc_vector3.h"
#include "math/dvc_matrix4.h"
DV_CORE_BEGIN_NAMESPACE
class DV_CORE_API CameraComponent : public SceneComponent
{
public:
struct CameraDefine
{
float32_t fov;
float32_t aspect;
float32_t nearClip;
float32_t farClip;
};
public:
virtual const std::string& getTypeName() const { return typeName(); }
virtual void render(const fMatrix4& transParent, RenderQueue& queue) const;
fVector3 getEye(void) const;
fVector3 getLookat(void) const;
fVector3 getUp(void) const;
void setCameraDefine(const CameraDefine& cameraDefine);
CameraDefine getCameraDefine() const {
return m_cameraDefine;
}
const fMatrix4& getViewMatrix(void) const {
return m_viewMatrix;
}
const fMatrix4& getViewProjMatrix(void) const {
return m_viewProjMatrix;
}
protected:
CameraDefine m_cameraDefine;
fMatrix4 m_viewMatrix;
fMatrix4 m_viewProjMatrix;
public:
CameraComponent(SceneNodePtr owner);
virtual ~CameraComponent();
static const std::string& typeName();
};
DV_CORE_END_NAMESPACE
@@ -0,0 +1,22 @@
#pragma once
#include "dvc_config.h"
#include "math/dvc_matrix4.h"
DV_CORE_BEGIN_NAMESPACE
class DV_CORE_API SceneComponent
{
public:
virtual const std::string& getTypeName() const = 0;
virtual void render(const fMatrix4& transParent, RenderQueue& queue) const;
protected:
SceneNodePtr m_owner;
public:
SceneComponent(SceneNodePtr owner);
virtual ~SceneComponent();
};
DV_CORE_END_NAMESPACE
@@ -0,0 +1,43 @@
#pragma once
#include "dvc_component.h"
#include "math/dvc_vector3.h"
//#include
DV_CORE_BEGIN_NAMESPACE
class DV_CORE_API LightComponent : public SceneComponent
{
public:
enum LightType
{
LT_Point,
LT_Directional,
LT_Spot,
};
struct LightDefine
{
LightType type;
fVector3 color; //default is "1.0, 1.0, 1.0"
float32_t intensity; //default is "1.0"
float32_t range; //default is "-1", means infinite
float32_t innerConeAngle; //only for spot light, default is 0
float32_t outerConeAngle; //only for spot light, default is PI/4.0
};
public:
virtual const std::string& getTypeName() const { return typeName(); }
virtual void render(const fMatrix4& transParent, RenderQueue& queue) const;
void setLightDefine(const LightDefine& lightDefine);
protected:
LightDefine m_define;
public:
LightComponent(SceneNodePtr owner);
virtual ~LightComponent();
static const std::string& typeName();
};
DV_CORE_END_NAMESPACE
@@ -0,0 +1,26 @@
#pragma once
#include "dvc_component.h"
#include "dvc_pre_declare.h"
DV_CORE_BEGIN_NAMESPACE
class DV_CORE_API MeshComponent : public SceneComponent
{
public:
virtual const std::string& getTypeName() const { return typeName(); }
virtual void render(const fMatrix4& transParent, RenderQueue& queue) const;
void setMesh(MeshConstPtr mesh);
protected:
MeshConstPtr m_mesh;
public:
MeshComponent(SceneNodePtr owner);
virtual ~MeshComponent();
static const std::string& typeName();
};
DV_CORE_END_NAMESPACE
+95
View File
@@ -0,0 +1,95 @@
#pragma once
#include "dvc_config.h"
#include "dvc_pre_declare.h"
DV_CORE_BEGIN_NAMESPACE
class DV_CORE_API Scene
{
public:
void init(void);
void clear(void);
public:
DeviceBufferPtr newDeviceBuffer(void);
int32_t getDeviceBufferCounts(void) const {
return (int32_t)m_deviceBufferArray.size();
}
DeviceBufferConstPtr getDeviceBuffer(int32_t index) const;
DeviceBufferViewPtr newDeviceBufferView(DeviceBufferConstPtr buffer, size_t offset, size_t length, size_t stride);
int32_t getDeviceBufferViewCounts(void) const {
return (int32_t)m_bufferViewArray.size();
}
DeviceBufferViewPtr getDeviceBufferView(int32_t index) const;
DeviceBufferAccessorPtr newDeviceBufferAccessor(DeviceBufferViewConstPtr bufferView, size_t offset,
size_t count, ComponentType componentType, DataType dataType);
int32_t getDeviceBufferAccessorCounts(void) const {
return (int32_t)m_bufferAccessorArray.size();
}
DeviceBufferAccessorPtr getDeviceBufferAccessor(int32_t index) const;
int32_t pushNewMeshAsset(MeshPtr mesh);
int32_t getMeshCounts(void) const {
return (int32_t)m_meshArray.size();
}
MeshConstPtr getMesh(int32_t index) const;
public:
SceneNodePtr newSceneNode(const std::string& name);
SceneNodePtr getRootSceneNode() const;
public:
template<typename ComponentType>
SceneNodeConstPtr getNodeWithComponent(const char* name = nullptr) const
{
return getNodeWithComponent<ComponentType>(name, getRootSceneNode());
}
template<typename ComponentType>
SceneNodeConstPtr getNodeWithComponent(const char* name, SceneNodeConstPtr node) const
{
size_t counts = node->getChildCounts();
for (size_t i = 0; i < counts; i++)
{
SceneNodeConstPtr childNodePtr = node->getChild(i);
if (name != nullptr && childNodePtr->getName() != name)
{
continue;
}
std::shared_ptr<const ComponentType> component = childNodePtr->getComponent<ComponentType>();
if (component)
{
return childNodePtr;
}
//get from child
SceneNodeConstPtr cameraNode = getNodeWithComponent<ComponentType>(name, childNodePtr);
if (cameraNode != nullptr)
{
return cameraNode;
}
}
return nullptr;
}
protected:
SceneNodePtr m_rootSceneNode;
//device resources
std::vector<DeviceBufferPtr> m_deviceBufferArray;
std::vector<DeviceBufferViewPtr> m_bufferViewArray;
std::vector<DeviceBufferAccessorPtr> m_bufferAccessorArray;
//asset resources
std::vector<MeshPtr> m_meshArray;
public:
Scene();
~Scene();
};
DV_CORE_END_NAMESPACE
@@ -0,0 +1,73 @@
#pragma once
#include "dvc_config.h"
#include "math/dvc_matrix4.h"
#include "math/dvc_vector3.h"
#include "dvc_pre_declare.h"
DV_CORE_BEGIN_NAMESPACE
class DV_CORE_API SceneNode : public std::enable_shared_from_this<SceneNode>
{
public:
void clear(void);
void addChild(SceneNodePtr child);
void addComponent(SceneComponentPtr component);
void setName(const std::string& name);
const std::string& getName() const;
void setParent(SceneNodePtr parent);
void setTransform(const fMatrix4& transform);
const fMatrix4& getTransform() const {
return m_transform;
}
fMatrix4 getWorldTransform() const;
fVector3 getPosition() const;
fVector3 getWorldPosition() const;
size_t getChildCounts() const {
return m_childen.size();
}
SceneNodeConstPtr getChild(size_t index) const;
size_t getComponentCounts() const {
return m_componentArray.size();
}
SceneComponentConstPtr getComponent(size_t index) const;
template<typename T>
const std::shared_ptr<const T> getComponent() const
{
for (size_t i = 0; i < getComponentCounts(); i++)
{
auto component = getComponent(i);
if (component->getTypeName() == T::typeName())
{
return std::dynamic_pointer_cast<const T>(component);
}
}
return nullptr;
}
public:
void buildRenderQueue(const fMatrix4& transParent, RenderQueue& queue);
protected:
std::string m_name;
fMatrix4 m_transform;
SceneNodePtr m_parent;
SceneNodeArray m_childen;
SceneComponentArray m_componentArray;
public:
SceneNode();
virtual ~SceneNode();
};
DV_CORE_END_NAMESPACE
@@ -0,0 +1,46 @@
#pragma once
#include "dvc_config.h"
#include "dvc_pre_declare.h"
#include "math/dvc_vector3.h"
#include "math/dvc_vector4.h"
#include "device/dvc_vertex_desc.h"
DV_CORE_BEGIN_NAMESPACE
class VertexShaderInterface
{
public:
virtual const char* getName(void) const = 0;
virtual const VertexDesc& getOutputVertexDesc() const = 0;
typedef std::function<DeviceBufferAccessorConstPtr(VertexElementType)> SetInputAttributeFunc;
virtual void prepare(const UniformBuffer* uniformBuffer, SetInputAttributeFunc setInputAttributeFunc) = 0;
virtual void process(size_t index, void* outputVertex, fVector3& vertexWorldPos) = 0;
};
class PixelShaderInterface
{
public:
virtual const char* getName(void) const = 0;
typedef std::function<size_t(const std::string&)> SetInputAttributeFunc;
virtual void prepare(const UniformBuffer* uniformBuffer, SetInputAttributeFunc setInputAttributeFunc) = 0;
virtual void process(const VertexDesc& veretexDesc, const float32_t* pixelData, fVector4& color) = 0;
};
class ShaderFileInterface
{
public:
virtual VertexShaderInterface* getVertexShader(const char* szName) = 0;
virtual PixelShaderInterface* getPixelShader(const char* szName) = 0;
};
typedef ShaderFileInterface* (*ShaderFileInterfaceFunc)();
DV_CORE_API ShaderFileInterface* LoadShaderFile(const char* szShaderFile);
DV_CORE_END_NAMESPACE
+31
View File
@@ -0,0 +1,31 @@
#include "asset/dvc_mesh.h"
DV_CORE_BEGIN_NAMESPACE
Mesh::Mesh(const std::string& name)
: m_name(name)
{
}
Mesh::~Mesh()
{
m_primitiveArray.clear();
}
Mesh::PrimitivePtr Mesh::newPrimitive(void)
{
PrimitivePtr primitive = std::make_shared<Primitive>();
m_primitiveArray.push_back(primitive);
return primitive;
}
Mesh::PrimitiveConstPtr Mesh::getPrimitive(int32_t index) const
{
if (index < 0 || index >= m_primitiveArray.size())
{
return nullptr;
}
return m_primitiveArray[index];
}
DV_CORE_END_NAMESPACE
+43
View File
@@ -0,0 +1,43 @@
#include "device/dvc_buffer.h"
DV_CORE_BEGIN_NAMESPACE
DeviceBuffer::DeviceBuffer()
: m_ptr(nullptr)
, m_length(0)
{
}
DeviceBuffer::DeviceBuffer(size_t _length)
: m_ptr(nullptr)
, m_length(0)
{
init(_length);
}
DeviceBuffer::~DeviceBuffer()
{
clear();
}
void DeviceBuffer::init(size_t _length)
{
assert(_length > 0);
clear();
m_ptr = (uint8_t*)malloc(_length);
memset(m_ptr, 0, _length);
m_length = _length;
}
void DeviceBuffer::clear(void)
{
if (m_ptr) {
free(m_ptr);
m_ptr = nullptr;
}
m_length = 0;
}
DV_CORE_END_NAMESPACE
@@ -0,0 +1,93 @@
#include "device/dvc_buffer_accessor.h"
#include "math/dvc_math_util.h"
DV_CORE_BEGIN_NAMESPACE
DeviceBufferAccessor::DeviceBufferAccessor(DeviceBufferViewConstPtr bufferView, size_t offset, size_t count, ComponentType componentType, DataType dataType)
: m_bufferView(bufferView)
, m_offset(offset)
, m_count(count)
, m_componentType(componentType)
, m_dataType(dataType)
{
m_elementSize = MathUtil::DataTypeSize(m_dataType) * MathUtil::ComponentSize(m_componentType);
}
DeviceBufferAccessor::~DeviceBufferAccessor()
{
m_bufferView.reset();
}
void DeviceBufferAccessor::walk(std::function<bool(const uint8_t*, size_t)> callback, size_t start, size_t end) const
{
assert(start < m_count);
assert((end == ((size_t)-1)) || (end>=start && end <=m_count));
DeviceBufferConstPtr buffer = m_bufferView->getBuffer();
const uint8_t* ptr = buffer->ptr(m_bufferView->getOffset()) + m_offset;
size_t startIndex = start;
size_t endIndex = (end == ((size_t)-1)) ? m_count : end;
for (size_t index = startIndex; index < endIndex; index++, ptr+=m_elementSize)
{
if (callback(ptr, index))
{
break;
}
}
}
void DeviceBufferAccessor::walk2(std::function<bool(const uint8_t*, const uint8_t*, size_t)> callback, size_t start, size_t end) const
{
assert(start < m_count);
assert((end == ((size_t)-1)) || (end >= start && end <= m_count));
DeviceBufferConstPtr buffer = m_bufferView->getBuffer();
const uint8_t* ptr = buffer->ptr(m_bufferView->getOffset()) + m_offset;
size_t startIndex = start;
size_t endIndex = (end == ((size_t)-1)) ? m_count : end;
for (size_t index = startIndex; index < endIndex; index+=2, ptr+=m_elementSize*2)
{
if (callback(ptr, ((index + 1) < endIndex) ? (ptr + m_elementSize) : nullptr, index))
{
break;
}
}
}
void DeviceBufferAccessor::walk3(std::function<bool(const uint8_t*, const uint8_t*, const uint8_t*, size_t)> callback, size_t start, size_t end) const
{
assert(start < m_count);
assert((end == ((size_t)-1)) || (end >= start && end <= m_count));
DeviceBufferConstPtr buffer = m_bufferView->getBuffer();
const uint8_t* ptr = buffer->ptr(m_bufferView->getOffset()) + m_offset;
size_t startIndex = start;
size_t endIndex = (end == ((size_t)-1)) ? m_count : end;
for (size_t index = startIndex; index < endIndex; index += 3, ptr += m_elementSize * 3)
{
if(callback(ptr,
((index + 1) < endIndex) ? (ptr + m_elementSize) : nullptr,
((index + 2) < endIndex) ? (ptr + m_elementSize*2) : nullptr,
index))
{
break;
}
}
}
const uint8_t* DeviceBufferAccessor::getElement(size_t index) const
{
if (index >= m_count) {
return nullptr;
}
DeviceBufferConstPtr buffer = m_bufferView->getBuffer();
const uint8_t* pData = buffer->ptr(m_bufferView->getOffset()) + m_offset + index * m_elementSize;
return pData;
}
DV_CORE_END_NAMESPACE
@@ -0,0 +1,21 @@
#include "device/dvc_buffer_view.h"
DV_CORE_BEGIN_NAMESPACE
DeviceBufferView::DeviceBufferView(DeviceBufferConstPtr buffer, size_t offset, size_t length, size_t stride)
: m_buffer(buffer)
, m_offset(offset)
, m_length(length)
, m_stride(stride)
{
}
DeviceBufferView::~DeviceBufferView()
{
m_buffer.reset();
m_offset = m_length = m_stride = 0;
}
DV_CORE_END_NAMESPACE
@@ -0,0 +1,5 @@
#include "device/dvc_pixel_buffer.h"
DV_CORE_BEGIN_NAMESPACE
DV_CORE_END_NAMESPACE
@@ -0,0 +1,34 @@
#include "device/dvc_render_target.h"
DV_CORE_BEGIN_NAMESPACE
RenderTarget::RenderTarget()
{
}
void RenderTarget::init(int32_t width, int32_t height)
{
m_width = width;
m_height = height;
m_colorBuffer.init(width, height, fVector4::BLACK);
m_depthBuffer.init(width, height, std::numeric_limits<float32_t>::max());
}
void RenderTarget::clear()
{
m_colorBuffer.clear(fVector4::BLACK);
m_depthBuffer.clear(std::numeric_limits<float32_t>::max());
}
void RenderTarget::setPixel(int32_t x, int32_t y, const fVector4& color, float32_t depth)
{
if (x < 0 || x >= m_width || y < 0 || y >= m_height) return;
if (depth > m_depthBuffer.getPixel(x, y)) {
return;
}
m_colorBuffer.setPixel(x, y, color);
m_depthBuffer.setPixel(x, y, depth);
}
DV_CORE_END_NAMESPACE
@@ -0,0 +1,130 @@
#include "device/dvc_uniform_buffer.h"
#include "math/dvc_math_util.h"
#include "scene/dvc_scene.h"
#include "scene/dvc_scene_node.h"
#include "scene/component/dvc_camera_component.h"
DV_CORE_BEGIN_NAMESPACE
void UniformBuffer::clear()
{
for (AttributeMap::iterator it = m_attributeMap.begin(); it != m_attributeMap.end(); ++it)
{
AttributeValue& value = it->second;
freeMemory(value.value); value.value = nullptr;
}
m_attributeMap.clear();
}
void UniformBuffer::updateStandardAttribute(const Scene& scene)
{
//Find main camera
davinci::SceneNodeConstPtr cameraNode = scene.getNodeWithComponent<CameraComponent>();
assert(cameraNode.get());
CameraComponentConstPtr camera = cameraNode->getComponent<CameraComponent>();
if (camera)
{
setAttribute("camera:eye_pos", camera->getEye());
setAttribute("camera:near", camera->getCameraDefine().nearClip);
setAttribute("camera:far", camera->getCameraDefine().farClip);
setAttribute("camera:view_mat", camera->getViewMatrix());
setAttribute("camera:view_proj_mat", camera->getViewProjMatrix());
}
}
void UniformBuffer::setAttribute(const std::string& name, ComponentType componentType, DataType dataType, const void* value)
{
size_t valueSize = MathUtil::ComponentSize(componentType) * MathUtil::DataTypeSize(dataType);
AttributeMap::iterator it = m_attributeMap.find(name);
if (it != m_attributeMap.end())
{
if (it->second.componentType != componentType || it->second.dataType != dataType)
{
//TODO: error type
return;
}
memcpy(it->second.value, value, valueSize);
return;
}
//insert new value
AttributeValue newValue;
newValue.name = name;
newValue.componentType = componentType;
newValue.dataType = dataType;
newValue.value = mallocMemory(valueSize);
memcpy(newValue.value, value, valueSize);
m_attributeMap.insert(std::make_pair(name, newValue));
}
void UniformBuffer::setAttribute(const std::string& name, const int32_t& value)
{
setAttribute(name, ComponentType::CT_Int32, DataType::DT_Scalar, &value);
}
void UniformBuffer::setAttribute(const std::string& name, const float32_t& value)
{
setAttribute(name, ComponentType::CT_Float32, DataType::DT_Scalar, &value);
}
void UniformBuffer::setAttribute(const std::string& name, const fVector2& value)
{
setAttribute(name, ComponentType::CT_Float32, DataType::DT_Vec2, &value);
}
void UniformBuffer::setAttribute(const std::string& name, const fVector3& value)
{
setAttribute(name, ComponentType::CT_Float32, DataType::DT_Vec3, &value);
}
void UniformBuffer::setAttribute(const std::string& name, const fVector4& value)
{
setAttribute(name, ComponentType::CT_Float32, DataType::DT_Vec4, &value);
}
void UniformBuffer::setAttribute(const std::string& name, const fMatrix3& value)
{
setAttribute(name, ComponentType::CT_Float32, DataType::DT_Matrix3, &value);
}
void UniformBuffer::setAttribute(const std::string& name, const fMatrix4& value)
{
setAttribute(name, ComponentType::CT_Float32, DataType::DT_Matrix4, &value);
}
void* UniformBuffer::getAttribute(const std::string& name) const
{
AttributeMap::const_iterator it = m_attributeMap.find(name);
if (it == m_attributeMap.end())
{
return nullptr;
}
return it->second.value;
}
void UniformBuffer::removeAttribute(const std::string& name)
{
AttributeMap::iterator it = m_attributeMap.find(name);
if (it != m_attributeMap.end())
{
freeMemory(it->second.value); it->second.value = nullptr;
m_attributeMap.erase(it);
return;
}
}
void* UniformBuffer::mallocMemory(size_t size)
{
return malloc(size);
}
void UniformBuffer::freeMemory(void* memory)
{
free(memory);
}
DV_CORE_END_NAMESPACE
@@ -0,0 +1,107 @@
#include "device/dvc_vertex_desc.h"
#include "math/dvc_math_util.h"
DV_CORE_BEGIN_NAMESPACE
VertexDesc::VertexDesc()
: m_vertexSize(0)
{
}
VertexDesc::VertexDesc(const VertexDesc& other)
{
m_elements = other.m_elements;
m_vertexSize = other.m_vertexSize;
m_elementTypeMap = other.m_elementTypeMap;
m_nameMap = other.m_nameMap;
}
bool VertexDesc::addElement(const std::string& name, VertexElementType elementType, ComponentType componentType, DataType dataType)
{
bool defineType = (elementType != VertexElementType::VET_UNKNOWN);
bool defineName = (name.length() > 0);
assert(defineType || defineName);
if (!(defineType || defineName))
{
return false;
}
bool conflictType = defineType && (m_elementTypeMap.find(elementType) != m_elementTypeMap.end());
assert(!conflictType);
if (conflictType)
{
return false;
}
bool conflictName = defineName && (m_nameMap.find(name) != m_nameMap.end());
assert(!conflictName);
if (conflictName)
{
return false;
}
assert(componentType != ComponentType::CT_UNKNOWN);
if (componentType == ComponentType::CT_UNKNOWN)
{
return false;
}
assert(dataType != DataType::DT_UNKNOWN);
if (dataType == DataType::DT_UNKNOWN)
{
return false;
}
Element element;
element.name = name;
element.elementType = elementType;
element.componentType = componentType;
element.dataType = dataType;
element.offset = m_vertexSize;
element.size = MathUtil::DataTypeSize(element.dataType) * MathUtil::ComponentSize(element.componentType);
m_vertexSize += element.size;
if (defineType)
{
m_elementTypeMap.insert(std::make_pair(elementType, m_elements.size()));
}
if (defineName)
{
m_nameMap.insert(std::make_pair(name, m_elements.size()));
}
m_elements.push_back(element);
return true;
}
const VertexDesc::Element* VertexDesc::getElement(size_t index) const
{
if (index >= m_elements.size())
{
return nullptr;
}
return &(m_elements[index]);
}
const VertexDesc::Element* VertexDesc::getElement(VertexElementType type) const
{
auto it = m_elementTypeMap.find(type);
if (it == m_elementTypeMap.end())
{
return nullptr;
}
return getElement(it->second);
}
const VertexDesc::Element* VertexDesc::getElement(const std::string& name) const
{
auto it = m_nameMap.find(name);
if (it == m_nameMap.end())
{
return nullptr;
}
return getElement(it->second);
}
DV_CORE_END_NAMESPACE
+7
View File
@@ -0,0 +1,7 @@
#include "dv_config.h"
#include "dvc_prerequisites.h"
DV_CORE_API int foo()
{
return 0;
}
+72
View File
@@ -0,0 +1,72 @@
#include "math/dvc_math_util.h"
DV_CORE_BEGIN_NAMESPACE
const float MathUtil::POS_INFINITY = std::numeric_limits<float>::infinity();
const float MathUtil::NEG_INFINITY = -std::numeric_limits<float>::infinity();
const float MathUtil::PI = float(4.0 * atan(1.0));
const float MathUtil::PI_X2 = float(2.0 * PI);
const float MathUtil::PI_DIV2 = float(0.5 * PI);
const float MathUtil::PI_DIV4 = float(0.25 * PI);
const float MathUtil::fDeg2Rad = PI / float(180.0);
const float MathUtil::fRad2Deg = float(180.0) / PI;
size_t MathUtil::ComponentSize(ComponentType ct)
{
switch (ct)
{
case CT_Int8:
return sizeof(int8_t);
case CT_Uint8:
return sizeof(uint8_t);
case CT_Int16:
return sizeof(int16_t);
case CT_Uint16:
return sizeof(uint16_t);
case CT_Int32:
return sizeof(int32_t);
case CT_Uint32:
return sizeof(uint32_t);
case CT_Float32:
return sizeof(float32_t);
case CT_Float64:
return sizeof(float64_t);
default:
break;
}
assert(false);
return 0;
}
size_t MathUtil::DataTypeSize(DataType dt)
{
switch (dt)
{
case DT_Scalar:
return 1;
case DT_Vec2:
return 2;
case DT_Vec3:
return 3;
case DT_Vec4:
return 4;
case DT_Matrix2:
return 4;
case DT_Matrix3:
return 9;
case DT_Matrix4:
return 16;
default:
break;
}
assert(false);
return 0;
}
float MathUtil::unitRandom(void)
{
return float(rand()) / RAND_MAX;
}
DV_CORE_END_NAMESPACE
+9
View File
@@ -0,0 +1,9 @@
#include "math/dvc_matrix3.h"
DV_CORE_BEGIN_NAMESPACE
const fMatrix3 fMatrix3::ZERO(0, 0, 0, 0, 0, 0, 0, 0, 0);
const fMatrix3 fMatrix3::IDENTITY(1, 0, 0, 0, 1, 0, 0, 0, 1);
DV_CORE_END_NAMESPACE
+9
View File
@@ -0,0 +1,9 @@
#include "math/dvc_matrix4.h"
DV_CORE_BEGIN_NAMESPACE
const fMatrix4 fMatrix4::ZERO(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
const fMatrix4 fMatrix4::IDENTITY(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);
DV_CORE_END_NAMESPACE
+15
View File
@@ -0,0 +1,15 @@
#include "math/dvc_vector2.h"
DV_CORE_BEGIN_NAMESPACE
const fVector2 fVector2::ZERO(0, 0);
const fVector2 fVector2::ONE(0, 0);
const fVector2 fVector2::UNIT_X(1, 0);
const fVector2 fVector2::UNIT_Y(0, 1);
const fVector2 fVector2::NEGATIVE_UNIT_X(-1, 0);
const fVector2 fVector2::NEGATIVE_UNIT_Y(0, -1);
const fVector2 fVector2::UNIT_SCALE(1, 1);
DV_CORE_END_NAMESPACE
+24
View File
@@ -0,0 +1,24 @@
#include "math/dvc_vector3.h"
DV_CORE_BEGIN_NAMESPACE
const fVector3 fVector3::ZERO(0, 0, 0);
const fVector3 fVector3::ONE(1, 1, 1);
const fVector3 fVector3::UNIT_X(1, 0, 0);
const fVector3 fVector3::UNIT_Y(0, 1, 0);
const fVector3 fVector3::UNIT_Z(0, 0, 1);
const fVector3 fVector3::NEGATIVE_UNIT_X(-1, 0, 0);
const fVector3 fVector3::NEGATIVE_UNIT_Y(0, -1, 0);
const fVector3 fVector3::NEGATIVE_UNIT_Z(0, 0, -1);
const fVector3 fVector3::UNIT_SCALE(1, 1, 1);
const fVector3 fVector3::WHITE(1, 1, 1);
const fVector3 fVector3::BLACK(0, 0, 0);
const fVector3 fVector3::RED(1, 0, 0);
const fVector3 fVector3::GREEN(0, 1, 0);
const fVector3 fVector3::BLUE(0, 0, 1);
const fVector3 fVector3::PURPLE(1, 0, 1);
const fVector3 fVector3::GRAY(0.5f, 0.5f, 0.5f);
DV_CORE_END_NAMESPACE
+16
View File
@@ -0,0 +1,16 @@
#include "math/dvc_vector4.h"
DV_CORE_BEGIN_NAMESPACE
const fVector4 fVector4::ZERO(0, 0, 0, 0);
const fVector4 fVector4::WHITE(1, 1, 1, 1);
const fVector4 fVector4::BLACK(0, 0, 0, 1);
const fVector4 fVector4::RED(1, 0, 0, 1);
const fVector4 fVector4::GREEN(0, 1, 0, 1);
const fVector4 fVector4::BLUE(0, 0, 1, 1);
const fVector4 fVector4::PURPLE(1, 0, 1, 1);
const fVector4 fVector4::GRAY(0.5f, 0.5f, 0.5f, 1);
DV_CORE_END_NAMESPACE
@@ -0,0 +1,496 @@
#include "pipe/dvc_rasterizer.h"
#include "math/dvc_fixmath.h"
#include "math/dvc_math_util.h"
/*
https://github.com/nlguillemot/vigilant-system
https://wiki.joak.org/public:cs:rasterization_on_larrabee
*/
DV_CORE_BEGIN_NAMESPACE
//-------------------------------------------------------------------------------------
struct DrawTriangleParam
{
int32_t widthInTiles;
bool ccw;
fVector2 verts[3];
float32_t bbox_min_x;
float32_t bbox_max_x;
float32_t bbox_min_y;
float32_t bbox_max_y;
bool tlBorder[3];
float32_t area;
ifloat3_t edgesDX, edgesDY;
};
//-------------------------------------------------------------------------------------
enum { TILE_WIDTH_IN_PIXELS = 64, COARSE_BLOCK_WIDTH_IN_PIXELS = 16, FINE_BLOCK_WIDTH_IN_PIXELS = 4 };
//-------------------------------------------------------------------------------------
void _drawTriangle_Fine(int32_t tile_id, int32_t coarse_id, int32_t fine_id,
const DrawTriangleParam& param, const ifloat3_t& edges0, uint32_t testEdgeMask,
Rasterizer::DrawTriangleCallback callback)
{
ifloat3_t pixelEdges(edges0);
const fVector2 v0(param.verts[0]), v1(param.verts[1]), v2(param.verts[2]);
const bool edgeMask[3] = { (testEdgeMask & 1) != 0 , (testEdgeMask & 2) != 0 , (testEdgeMask & 4) != 0 };
int32_t fine_start_x = (tile_id % param.widthInTiles) * TILE_WIDTH_IN_PIXELS
+ (coarse_id % 4) * COARSE_BLOCK_WIDTH_IN_PIXELS + (fine_id % 4) * FINE_BLOCK_WIDTH_IN_PIXELS;
int32_t fine_start_y = (tile_id / param.widthInTiles) * TILE_WIDTH_IN_PIXELS
+ (coarse_id / 4) * COARSE_BLOCK_WIDTH_IN_PIXELS + (fine_id / 4)*FINE_BLOCK_WIDTH_IN_PIXELS;
for (int32_t y_index=0, y= fine_start_y; y_index < 4; y_index++, y++)
{
ifloat3_t edgesRow(pixelEdges);
for (int32_t x_index = 0, x=fine_start_x; x_index < 4; x_index++, x++)
{
bool rejected =
(edgeMask[0] && (edgesRow.x < 0 || (!param.tlBorder[0] && edgesRow.x == 0))) ||
(edgeMask[1] && (edgesRow.y < 0 || (!param.tlBorder[1] && edgesRow.y == 0))) ||
(edgeMask[2] && (edgesRow.z < 0 || (!param.tlBorder[2] && edgesRow.z == 0)));
if (!rejected)
{
fVector2 pixel(x + 0.5f, y + 0.5f);
float32_t w0 = (v2 - v1).crossProduct(pixel - v2);
float32_t w1 = (v0 - v2).crossProduct(pixel - v0);
float32_t w2 = (v1 - v0).crossProduct(pixel - v1);
fVector3 t = fVector3(w0 / param.area, (param.ccw ? w1 : w2) / param.area, (param.ccw ? w2 : w1) / param.area);
callback(std::make_pair(x, y), t);
}
edgesRow.sub(param.edgesDY);
}
pixelEdges.add(param.edgesDX);
}
}
//-------------------------------------------------------------------------------------
void _drawTriangle_Coarse(int32_t tile_id, int32_t coarse_id,
DrawTriangleParam& param, const ifloat3_t& edges0, uint32_t testEdgeMask,
Rasterizer::DrawTriangleCallback callback)
{
const ifloat3_t blockEdgesDX(
param.edgesDX.x * FINE_BLOCK_WIDTH_IN_PIXELS,
param.edgesDX.y * FINE_BLOCK_WIDTH_IN_PIXELS,
param.edgesDX.z * FINE_BLOCK_WIDTH_IN_PIXELS
);
const ifloat3_t blockEdgesDY(
param.edgesDY.x * FINE_BLOCK_WIDTH_IN_PIXELS,
param.edgesDY.y * FINE_BLOCK_WIDTH_IN_PIXELS,
param.edgesDY.z * FINE_BLOCK_WIDTH_IN_PIXELS
);
const bool edgeMask[3] = { (testEdgeMask & 1) != 0 , (testEdgeMask & 2) != 0 , (testEdgeMask & 4) != 0 };
ifloat3_t blockReject(edges0);
ifloat3_t blockAccept(edges0);
ifloat3_t blockEdges(edges0);
for (size_t v = 0; v < 3; v++)
{
if (edgeMask[v])
{
if (blockEdgesDX[v] > 0) blockReject[v] += blockEdgesDX[v];
else if (blockEdgesDX[v] < 0) blockAccept[v] += blockEdgesDX[v];
if (blockEdgesDY[v] > 0) blockAccept[v] -= blockEdgesDY[v];
else if (blockEdgesDY[v] < 0) blockReject[v] -= blockEdgesDY[v];
}
}
int32_t block_start_x = (tile_id % param.widthInTiles) * TILE_WIDTH_IN_PIXELS + (coarse_id % 4) * COARSE_BLOCK_WIDTH_IN_PIXELS;
int32_t block_start_y = (tile_id / param.widthInTiles) * TILE_WIDTH_IN_PIXELS + (coarse_id / 4) * COARSE_BLOCK_WIDTH_IN_PIXELS;
for (int32_t y_index = 0; y_index < 4; y_index++)
{
if (block_start_y + y_index * FINE_BLOCK_WIDTH_IN_PIXELS > param.bbox_max_y)
{
break;
}
if (block_start_y + (y_index + 1)*FINE_BLOCK_WIDTH_IN_PIXELS >= param.bbox_min_y)
{
ifloat3_t edgesRow(blockEdges);
ifloat3_t edgesRowReject, edgesRowAccept;
for (size_t v = 0; v < 3; v++)
{
if (edgeMask[v])
{
edgesRowReject[v] = blockReject[v];
edgesRowAccept[v] = blockAccept[v];
}
}
for (int32_t x_index = 0; x_index < 4; x_index++)
{
if (block_start_x + x_index * FINE_BLOCK_WIDTH_IN_PIXELS > param.bbox_max_x) break;
if (block_start_x + (x_index + 1)*FINE_BLOCK_WIDTH_IN_PIXELS >= param.bbox_min_x)
{
bool rejected =
(edgeMask[0] && (edgesRowReject[0] < 0 || (!param.tlBorder[0] && edgesRowReject[0] == 0))) ||
(edgeMask[1] && (edgesRowReject[1] < 0 || (!param.tlBorder[1] && edgesRowReject[1] == 0))) ||
(edgeMask[2] && (edgesRowReject[2] < 0 || (!param.tlBorder[2] && edgesRowReject[2] == 0)));
if (!rejected)
{
uint32_t newTestEdgeMask = testEdgeMask;
for (size_t v = 0; v < 3; v++)
{
if (edgeMask[v])
{
if (edgesRowAccept[v] > 0 || (edgesRowAccept[v] == 0 && param.tlBorder[v]))
{
newTestEdgeMask &= ~(1 << v);
}
}
}
_drawTriangle_Fine(tile_id, coarse_id, y_index * 4 + x_index, param, edgesRow, newTestEdgeMask, callback);
}
}
edgesRow.sub(blockEdgesDY);
for (size_t v = 0; v < 3; v++)
{
if (edgeMask[v])
{
edgesRowReject[v] -= blockEdgesDY[v];
edgesRowAccept[v] -= blockEdgesDY[v];
}
}
}
}
blockEdges.add(blockEdgesDX);
for (size_t v = 0; v < 3; v++)
{
if (edgeMask[v])
{
blockReject[v] += blockEdgesDX[v];
blockAccept[v] += blockEdgesDX[v];
}
}
}
}
//-------------------------------------------------------------------------------------
void _drawTriangle_Title(int32_t tile_id,
DrawTriangleParam& param, const ifloat3_t& edges0, uint32_t testEdgeMask,
Rasterizer::DrawTriangleCallback callback)
{
const ifloat3_t blockEdgesDX(
param.edgesDX[0] * COARSE_BLOCK_WIDTH_IN_PIXELS,
param.edgesDX[1] * COARSE_BLOCK_WIDTH_IN_PIXELS,
param.edgesDX[2] * COARSE_BLOCK_WIDTH_IN_PIXELS
);
const ifloat3_t blockEdgesDY(
param.edgesDY[0] * COARSE_BLOCK_WIDTH_IN_PIXELS,
param.edgesDY[1] * COARSE_BLOCK_WIDTH_IN_PIXELS,
param.edgesDY[2] * COARSE_BLOCK_WIDTH_IN_PIXELS
);
const bool edgeMask[3] = { (testEdgeMask & 1) != 0 , (testEdgeMask & 2) != 0 , (testEdgeMask & 4) != 0 };
ifloat3_t blockReject(edges0);
ifloat3_t blockAccept(edges0);
ifloat3_t blockEdges(edges0);
for (size_t v = 0; v < 3; v++)
{
if (edgeMask[v])
{
if (blockEdgesDX[v] > 0) blockReject[v] += blockEdgesDX[v];
else if (blockEdgesDX[v] < 0) blockAccept[v] += blockEdgesDX[v];
if (blockEdgesDY[v] > 0) blockAccept[v] -= blockEdgesDY[v];
else if (blockEdgesDY[v] < 0) blockReject[v] -= blockEdgesDY[v];
}
}
int32_t block_start_x = (tile_id % param.widthInTiles) * TILE_WIDTH_IN_PIXELS;
int32_t block_start_y = (tile_id / param.widthInTiles) * TILE_WIDTH_IN_PIXELS;
for (int32_t y_index = 0; y_index < 4; y_index++)
{
if (block_start_y + y_index * COARSE_BLOCK_WIDTH_IN_PIXELS > param.bbox_max_y)
{
break;
}
if (block_start_y + (y_index + 1)*COARSE_BLOCK_WIDTH_IN_PIXELS >= param.bbox_min_y)
{
ifloat3_t edges(blockEdges);
ifloat3_t edgesRowReject, edgesRowAccept;
for (size_t v = 0; v < 3; v++)
{
if (edgeMask[v])
{
edgesRowReject[v] = blockReject[v];
edgesRowAccept[v] = blockAccept[v];
}
}
for (int32_t x_index = 0; x_index < 4; x_index++)
{
if (block_start_x + x_index * COARSE_BLOCK_WIDTH_IN_PIXELS > param.bbox_max_x)
{
break;
}
if (block_start_x + (x_index + 1)*COARSE_BLOCK_WIDTH_IN_PIXELS >= param.bbox_min_x)
{
bool rejected =
(edgeMask[0] && (edgesRowReject[0] < 0 || (!param.tlBorder[0] && edgesRowReject[0] == 0))) ||
(edgeMask[1] && (edgesRowReject[1] < 0 || (!param.tlBorder[1] && edgesRowReject[1] == 0))) ||
(edgeMask[2] && (edgesRowReject[2] < 0 || (!param.tlBorder[2] && edgesRowReject[2] == 0)));
if (!rejected)
{
uint32_t newTestEdgeMask = testEdgeMask;
for (size_t v = 0; v < 3; v++)
{
if (edgeMask[v])
{
if (edgesRowAccept[v] > 0 || (edgesRowAccept[v] == 0 && param.tlBorder[v]))
{
newTestEdgeMask &= ~(1 << v);
}
}
}
_drawTriangle_Coarse(tile_id, y_index * 4 + x_index, param, edges, newTestEdgeMask, callback);
}
}
edges.sub(blockEdgesDY);
for (size_t v = 0; v < 3; v++)
{
if (edgeMask[v])
{
edgesRowReject[v] -= blockEdgesDY[v];
edgesRowAccept[v] -= blockEdgesDY[v];
}
}
}
}
blockEdges.add(blockEdgesDX);
for (size_t v = 0; v < 3; v++)
{
if (edgeMask[v])
{
blockReject[v] += blockEdgesDX[v];
blockAccept[v] += blockEdgesDX[v];
}
}
}
}
//-------------------------------------------------------------------------------------
void Rasterizer::drawTriangleLarrabee(int32_t canvasWidth, int32_t canvasHeight,
const fVector2& v0, const fVector2& v1, const fVector2& v2,
DrawTriangleCallback callback, bool ccw)
{
assert(canvasWidth >= TILE_WIDTH_IN_PIXELS && canvasHeight >= TILE_WIDTH_IN_PIXELS);
assert(canvasWidth%TILE_WIDTH_IN_PIXELS == 0 && canvasHeight%TILE_WIDTH_IN_PIXELS == 0);
DrawTriangleParam param;
param.widthInTiles = canvasWidth / TILE_WIDTH_IN_PIXELS;
//ccw
bool isCCW = (v1 - v0).crossProduct(v2 - v1)>0;
if (isCCW != ccw) return;
param.ccw = ccw;
param.verts[0] = v0;
param.verts[1] = ccw ? v1 : v2;
param.verts[2] = ccw ? v2 : v1;
param.area = (param.verts[1] - param.verts[0]).crossProduct(param.verts[2] - param.verts[1]);
ifloat2_t vertices[3];
for (size_t i = 0; i < 3; i++)
{
vertices[i] = ifloat2_t(param.verts[i].x, param.verts[i].y);
}
//get window coordinates bounding box
param.bbox_min_x = MathUtil::min3(v0.x, v1.x, v2.x);
param.bbox_max_x = MathUtil::max3(v0.x, v1.x, v2.x);
param.bbox_min_y = MathUtil::min3(v0.y, v1.y, v2.y);
param.bbox_max_y = MathUtil::max3(v0.y, v1.y, v2.y);
//canvas size
ifloat_t iCanvasWidth = ifloat_init(canvasWidth);
ifloat_t iCanvasHeight = ifloat_init(canvasHeight);
// clip triangles that are fully outside the scissor rect (scissor rect = whole window)
if (param.bbox_max_x < 0 || param.bbox_max_y < 0 || param.bbox_min_x >= canvasWidth || param.bbox_min_y >= canvasHeight)
{
return;
}
if (param.bbox_min_x < 0) param.bbox_min_x = 0;
if (param.bbox_min_y < 0) param.bbox_min_y = 0;
if (param.bbox_max_x > canvasWidth - 1.f) param.bbox_max_x = canvasWidth - 1.f;
if (param.bbox_max_y > canvasHeight - 1.f) param.bbox_max_y = canvasHeight - 1.f;
// tile range
int32_t first_tile_x = (int32_t)(param.bbox_min_x / TILE_WIDTH_IN_PIXELS);
int32_t first_tile_y = (int32_t)(param.bbox_min_y / TILE_WIDTH_IN_PIXELS);
int32_t last_tile_x = (int32_t)(param.bbox_max_x / TILE_WIDTH_IN_PIXELS);
int32_t last_tile_y = (int32_t)(param.bbox_max_y / TILE_WIDTH_IN_PIXELS);
// evaluate edge equation at the top left tile
ifloat_t firstTileX = first_tile_x * ifloat_init(TILE_WIDTH_IN_PIXELS);
ifloat_t firstTileY = first_tile_y * ifloat_init(TILE_WIDTH_IN_PIXELS);
ifloat3_t edges0;
ifloat3_t tileEdgesDX, tileEdgesDY, edgesReject, edgesAccept;
const ifloat_t kZeroPointFive = ifloat_init(0.5f);
for (size_t v = 0; v < 3; v++)
{
size_t v_end = (v + 1) % 3;
param.edgesDX[v] = vertices[v_end].x - vertices[v].x;
param.edgesDY[v] = vertices[v_end].y - vertices[v].y;
tileEdgesDX[v] = param.edgesDX[v] * TILE_WIDTH_IN_PIXELS;
tileEdgesDY[v] = param.edgesDY[v] * TILE_WIDTH_IN_PIXELS;
//(V0,V1) X (V0, P) = (x1-x0)(py-y0)-(y1-y0)(px-x0)
edges0[v] = ifloat_multiply(param.edgesDX[v], (firstTileY + kZeroPointFive - vertices[v].y))
- ifloat_multiply(param.edgesDY[v], (firstTileX + kZeroPointFive - vertices[v].x));
// Top-left rule:
// shift top-left edges ever so slightly outward to make the top-left edges be
// the tie-breakers when rasterizing adjacent triangles
if ((vertices[v_end].y == vertices[v].y && vertices[v_end].x < vertices[v].x) ||
vertices[v_end].y < vertices[v].y)
{
param.tlBorder[v] = true;
}
else
{
param.tlBorder[v] = false;
}
edgesReject[v] = edgesAccept[v] = edges0[v];
if (tileEdgesDX[v] > 0) edgesReject[v] += tileEdgesDX[v];
else if (tileEdgesDX[v] < 0) edgesAccept[v] += tileEdgesDX[v];
if (tileEdgesDY[v] > 0) edgesAccept[v] -= tileEdgesDY[v];
else if (tileEdgesDY[v] < 0) edgesReject[v] -= tileEdgesDY[v];
}
ifloat3_t rowEdges(edges0);
int32_t tile_row_start = first_tile_y * param.widthInTiles + first_tile_x;
for (int32_t tile_y = first_tile_y; tile_y <= last_tile_y; tile_y++)
{
ifloat3_t edges(rowEdges);
ifloat3_t tileEdgesReject(edgesReject);
ifloat3_t tileEdgesAccept(edgesAccept);
int32_t tile_i = tile_row_start;
for (int32_t tile_x = first_tile_x; tile_x <= last_tile_x; tile_x++)
{
bool rejected =
((tileEdgesReject[0] < 0 || (!param.tlBorder[0] && tileEdgesReject[0] == 0))) ||
((tileEdgesReject[1] < 0 || (!param.tlBorder[1] && tileEdgesReject[1] == 0))) ||
((tileEdgesReject[2] < 0 || (!param.tlBorder[2] && tileEdgesReject[2] == 0)));
if (!rejected)
{
//draw title
uint32_t testEdgeMask = 0;
for (size_t v = 0; v < 3; v++)
{
if (tileEdgesAccept[v] < 0 || (tileEdgesAccept[v] == 0 && !param.tlBorder[v]))
{
testEdgeMask += (1 << v);
}
}
_drawTriangle_Title(tile_i, param, edges, testEdgeMask, callback);
}
//x setp
edges.sub(tileEdgesDY);
tileEdgesReject.sub(tileEdgesDY);
tileEdgesAccept.sub(tileEdgesDY);
tile_i++;
}
//y step
rowEdges.add(tileEdgesDX);
edgesReject.add(tileEdgesDX);
edgesAccept.add(tileEdgesDX);
tile_row_start += param.widthInTiles;
}
}
//-------------------------------------------------------------------------------------
void Rasterizer::drawTriangleScanline(int32_t canvasWidth, int32_t canvasHeight, const fVector3& v0, const fVector3& v1, const fVector3& v2, DrawTriangleCallback callback)
{
#if 0
//back cull
fVector3 edge0 = v2 - v1;
fVector3 edge1 = v0 - v2;
fVector3 vnormal = edge0.crossProduct(edge1);
if (vnormal.z > 0) return;
fVector3 edge2 = v1 - v0;
float xmin = MathUtil::min3(v0.x, v1.x, v2.x);
float ymin = MathUtil::min3(v0.y, v1.y, v2.y);
float xmax = MathUtil::max3(v0.x, v1.x, v2.x);
float ymax = MathUtil::max3(v0.y, v1.y, v2.y);
float area = _edge(v0, v1, v2);
int32_t x0 = MathUtil::max2(0, (int32_t)std::floor(xmin));
int32_t x1 = MathUtil::min2(canvasWidth - 1, (int32_t)std::floor(xmax));
int32_t y0 = MathUtil::max2(0, (int32_t)std::floor(ymin));
int32_t y1 = MathUtil::min2(canvasHeight - 1, (int32_t)std::floor(ymax));
for (int32_t y = y0; y <= y1; y++) {
for (int32_t x = x0; x <= x1; x++) {
fVector3 pixel(x + 0.5f, y + 0.5f, 0.f);
bool overlaps = true;
float w0 = _edge(v1, v2, pixel);
overlaps &= (w0 == 0 ? ((edge0.y == 0 && edge0.x > 0) || edge0.y > 0) : (w0 > 0));
if (!overlaps) continue;
float w1 = _edge(v2, v0, pixel);
overlaps &= (w1 == 0 ? ((edge1.y == 0 && edge1.x > 0) || edge1.y > 0) : (w1 > 0));
if (!overlaps) continue;
float w2 = _edge(v0, v1, pixel);
overlaps &= (w2 == 0 ? ((edge2.y == 0 && edge2.x > 0) || edge2.y > 0) : (w2 > 0));
if (!overlaps) continue;
fVector3 t = fVector3(w0 / area, w1 / area, w2 / area);
float invZ = MathUtil::lerp3(v0.z, v1.z, v2.z, t);
t *= fVector3(v0.z / invZ, v1.z / invZ, v2.z / invZ);
callback(std::make_pair(x, y), t);
}
}
#endif
}
DV_CORE_END_NAMESPACE
@@ -0,0 +1,56 @@
#include "pipe/dvc_render_queue.h"
#include "scene/dvc_scene_node.h"
#include "pipe/dvc_render_step_IA.h"
#include "pipe/dvc_render_step_VS.h"
#include "pipe/dvc_render_step_PS.h"
#include "scene/component/dvc_camera_component.h"
DV_CORE_BEGIN_NAMESPACE
RenderQueue::RenderQueue()
{
}
RenderQueue::~RenderQueue()
{
}
void RenderQueue::pushRenderable(RenderableConstPtr renderable)
{
m_queue.push_back(renderable);
}
RenderableConstPtr RenderQueue::getRenderable(size_t index) const
{
assert(index < m_queue.size());
if (index < m_queue.size())
{
return m_queue[index];
}
return nullptr;
}
void RenderQueue::build(const Scene& scene)
{
//Build render queue
scene.getRootSceneNode()->buildRenderQueue(fMatrix4::IDENTITY, *this);
}
void RenderQueue::process(UniformBuffer& uniformBuffer, RenderTarget& renderTarget)
{
//Assembere input
InputAssemberStep IA;
IA.process(*this);
//Vertex shader
VertexShaderStep VS;
VS.process(uniformBuffer, IA.getNodes());
//Pixel shader
PixelShaderStep PS;
PS.process(VS.getNodes(), renderTarget);
}
DV_CORE_END_NAMESPACE
@@ -0,0 +1,25 @@
#include "pipe/dvc_render_step_IA.h"
#include "pipe/dvc_renderable.h"
DV_CORE_BEGIN_NAMESPACE
void InputAssemberStep::process(const RenderQueue& renderQueue)
{
size_t counts = renderQueue.getRenderableCounts();
for (size_t i = 0; i < counts; i++)
{
RenderableConstPtr renderable = renderQueue.getRenderable(i);
if (renderable)
{
Node node;
if (!(renderable->buildAssemberNode(node)))
{
continue;
}
m_nodes.push_back(node);
}
}
}
DV_CORE_END_NAMESPACE
@@ -0,0 +1,75 @@
#include "pipe/dvc_render_step_PS.h"
#include "shader/dvc_shader_interface.h"
#include "device/dvc_buffer.h"
#include "pipe/dvc_rasterizer.h"
#include "math/dvc_math_util.h"
DV_CORE_BEGIN_NAMESPACE
void PixelShaderStep::process(const VertexShaderStep::NodeArray& vsNodeArray, RenderTarget& renderTarget)
{
ShaderFileInterface* shaderInterface = davinci::LoadShaderFile("TestShader.dll");
PixelShaderInterface* pixelShader = shaderInterface->getPixelShader("xxx");
int32_t targetWidth = renderTarget.getWidth();
int32_t targetHeight = renderTarget.getHeight();
fMatrix4 view_trans =
fMatrix4::makeTrans(targetWidth / 2.f, targetHeight / 2.f, 0.f) *
fMatrix4::makeScale(targetWidth / 2.f, targetHeight / 2.f, 1.f);
VertexShaderStep::NodeArray::const_iterator it, end = vsNodeArray.end();
for (it = vsNodeArray.begin(); it != end; ++it)
{
const VertexShaderStep::Node& node = *it;
size_t vertexSize = node.vertexDesc.vertexByteSize();
size_t POS_offset = node.vertexDesc.getElement(VET_POSITION)->offset;
for (size_t i = 0; i < node.vertexCounts; i += 3)
{
const float32_t* vertex0 = (const float32_t*)(node.vertexBuf->ptr(i * vertexSize));
const float32_t* vertex1 = (const float32_t*)(node.vertexBuf->ptr((i+1) * vertexSize));
const float32_t* vertex2 = (const float32_t*)(node.vertexBuf->ptr((i+2) * vertexSize));
fVector3 pos0 = view_trans * (*(const fVector3*)(vertex0 + POS_offset));
fVector3 pos1 = view_trans * (*(const fVector3*)(vertex1 + POS_offset));
fVector3 pos2 = view_trans * (*(const fVector3*)(vertex2 + POS_offset));
std::vector<float32_t> invZ = { node.invZ[i + 0], node.invZ[i + 1], node.invZ[i + 2] };
std::vector<float32_t> vertexDepth = { node.depth[i+0], node.depth[i + 1], node.depth[i + 2]};
Rasterizer::drawTriangleLarrabee(targetWidth, targetHeight, pos0.xy(), pos1.xy(), pos2.xy(),
[pixelShader, vertex0, vertex1, vertex2, invZ, vertexDepth, &node, &renderTarget]
(const std::pair<int32_t, int32_t>& dot, const fVector3& percent)
{
fVector3 percentCorrected(percent);
float temp = MathUtil::lerp3(invZ[0], invZ[1], invZ[2], percent);
percentCorrected *= fVector3(invZ[0] / temp, invZ[1] / temp, invZ[2] / temp);
std::vector<float32_t> pixelData;
const size_t floatCounts = node.vertexDesc.vertexByteSize() / sizeof(float32_t);
pixelData.resize(floatCounts);
for (size_t j = 0; j < floatCounts; j++)
{
pixelData[j] = MathUtil::lerp3(vertex0[j], vertex1[j], vertex2[j], percentCorrected);
}
fVector4 color;
pixelShader->process(node.vertexDesc, &(pixelData[0]), color);
float32_t depth = MathUtil::lerp3(vertexDepth[0], vertexDepth[1], vertexDepth[2], percentCorrected);
int32_t x = dot.first;
int32_t y = dot.second;
renderTarget.setPixel(x, y, color, depth);
}
);
}
}
}
DV_CORE_END_NAMESPACE
@@ -0,0 +1,84 @@
#include "pipe/dvc_render_step_VS.h"
#include "shader/dvc_shader_interface.h"
#include "device/dvc_buffer_accessor.h"
#include "math/dvc_math_util.h"
DV_CORE_BEGIN_NAMESPACE
void VertexShaderStep::process(UniformBuffer& uniformBuffer, const InputAssemberStep::NodeArray& assembedNodeArray)
{
ShaderFileInterface* shaderInterface = davinci::LoadShaderFile("TestShader.dll");
VertexShaderInterface* standardVS = shaderInterface->getVertexShader("xxxx");
const fVector3* eyePos = (const fVector3*)(uniformBuffer.getAttribute("camera:eye_pos"));
const fMatrix4* cameraView = (const fMatrix4*)(uniformBuffer.getAttribute("camera:view_mat"));
float32_t cameraNear = *((const float32_t*)(uniformBuffer.getAttribute("camera:near")));
float32_t cameraFar = *((const float32_t*)(uniformBuffer.getAttribute("camera:far")));
//int debug_index = 0;
InputAssemberStep::NodeArray::const_iterator it, end = assembedNodeArray.end();
for (it = assembedNodeArray.begin(); it != end; ++it)
{
const InputAssemberStep::Node& inputNode = *it;
//update self uniform value
uniformBuffer.setAttribute("self:world_transform", inputNode.transform);
standardVS->prepare(&uniformBuffer,
[inputNode](VertexElementType type) -> DeviceBufferAccessorConstPtr
{
InputAssemberStep::PrimitiveAttributes::const_iterator it = inputNode.vertexData.find(type);
if (it != inputNode.vertexData.end())
{
return it->second;
}
return nullptr;
}
);
size_t vertexCounts = inputNode.indices->getCount();
Node outputNode;
outputNode.vertexCounts = vertexCounts;
outputNode.vertexDesc = standardVS->getOutputVertexDesc();
outputNode.vertexBuf = std::make_shared<DeviceBuffer>(outputNode.vertexDesc.vertexByteSize() * vertexCounts);
outputNode.depth.resize(vertexCounts);
outputNode.invZ.resize(vertexCounts);
for (size_t i = 0; i < vertexCounts; i++)
{
size_t index = 0;
if (inputNode.indices->getComponentType() == CT_Uint16)
{
index = (size_t)(*(uint16_t*)(inputNode.indices->getElement(i)));
}
else if(inputNode.indices->getComponentType() == CT_Uint32)
{
index = (size_t)(*(uint32_t*)(inputNode.indices->getElement(i)));
}
else
{
//error
}
fVector3 vertexWorldPos;
void* outputVertexMemory = outputNode.vertexBuf->ptr(i* outputNode.vertexDesc.vertexByteSize());
standardVS->process(index, outputVertexMemory, vertexWorldPos);
//TODO: clip
//TODO: div-zero
fVector3 cameraSpacePos = (*cameraView) * vertexWorldPos;
outputNode.depth[i] = (std::fabsf(cameraSpacePos.z) - cameraNear) / (cameraFar - cameraNear);
float32_t cameraSpaceZ = cameraSpacePos.z;
outputNode.invZ[i] = 1.f/std::fabsf(cameraSpacePos.z);
}
m_nodes.push_back(outputNode);
}
}
DV_CORE_END_NAMESPACE
@@ -0,0 +1,11 @@
#include "pipe/dvc_renderable.h"
DV_CORE_BEGIN_NAMESPACE
Renderable::Renderable(const fMatrix4& worldTransform)
: m_worldTransform(worldTransform)
{
}
DV_CORE_END_NAMESPACE
@@ -0,0 +1,22 @@
#include "pipe/dvc_renderable_entity.h"
DV_CORE_BEGIN_NAMESPACE
RenderableEntity::RenderableEntity(Mesh::PrimitiveConstPtr primitive, const fMatrix4& worldTransform)
: m_primitive(primitive)
, Renderable(worldTransform)
{
}
bool RenderableEntity::buildAssemberNode(InputAssemberStep::Node& node) const
{
node.primitiveType = m_primitive->type;
node.transform = m_worldTransform;
node.vertexData = m_primitive->attributes;
node.indices = m_primitive->indices;
return true;
}
DV_CORE_END_NAMESPACE
@@ -0,0 +1,59 @@
#include "scene/component/dvc_camera_component.h"
#include "math/dvc_math_util.h"
#include "scene/dvc_scene_node.h"
#include "math/dvc_matrix4.h"
#include "math/dvc_vector4.h"
DV_CORE_BEGIN_NAMESPACE
CameraComponent::CameraComponent(SceneNodePtr owner)
: SceneComponent(owner)
{
}
CameraComponent::~CameraComponent()
{
}
const std::string& CameraComponent::typeName()
{
static std::string s_typename = "Camera";
return s_typename;
}
fVector3 CameraComponent::getEye(void) const
{
return m_owner->getWorldPosition();
}
fVector3 CameraComponent::getLookat(void) const
{
//negative z-axis.
fVector4 p = (m_owner->getTransform() * fVector4(0, 0, -1, 1));
return p.xyz() / p.w;
}
fVector3 CameraComponent::getUp(void) const
{
//y-axis
return (m_owner->getTransform() * fVector4(0, 1, 0, 0)).xyz();
}
void CameraComponent::setCameraDefine(const CameraComponent::CameraDefine& cameraDefine)
{
m_cameraDefine = cameraDefine;
fMatrix4 matView = MathUtil::lookatRH(getEye(), getLookat(), getUp());
fMatrix4 matProj = MathUtil::perspectiveFovRH(m_cameraDefine.fov, m_cameraDefine.aspect, m_cameraDefine.nearClip, m_cameraDefine.farClip);
m_viewMatrix = matView;
m_viewProjMatrix = matProj * matView;
}
void CameraComponent::render(const fMatrix4& transParent, RenderQueue& queue) const
{
}
DV_CORE_END_NAMESPACE
@@ -0,0 +1,21 @@
#include "scene/component/dvc_component.h"
DV_CORE_BEGIN_NAMESPACE
SceneComponent::SceneComponent(SceneNodePtr owner)
: m_owner(owner)
{
}
SceneComponent::~SceneComponent()
{
}
void SceneComponent::render(const fMatrix4& transParent, RenderQueue& queue) const
{
}
DV_CORE_END_NAMESPACE
@@ -0,0 +1,33 @@
#include "scene/component/dvc_light_component.h"
DV_CORE_BEGIN_NAMESPACE
LightComponent::LightComponent(SceneNodePtr owner)
: SceneComponent(owner)
{
}
LightComponent::~LightComponent()
{
}
const std::string& LightComponent::typeName()
{
static std::string s_typename = "Light";
return s_typename;
}
void LightComponent::setLightDefine(const LightDefine& lightDefine)
{
m_define = lightDefine;
}
void LightComponent::render(const fMatrix4& transParent, RenderQueue& queue) const
{
}
DV_CORE_END_NAMESPACE
@@ -0,0 +1,44 @@
#include "scene/component/dvc_mesh_component.h"
#include "asset/dvc_mesh.h"
#include "pipe/dvc_renderable_entity.h"
#include "pipe/dvc_render_queue.h"
DV_CORE_BEGIN_NAMESPACE
MeshComponent::MeshComponent(SceneNodePtr owner)
: SceneComponent(owner)
{
}
MeshComponent::~MeshComponent()
{
}
const std::string& MeshComponent::typeName()
{
static std::string s_typename = "Mesh";
return s_typename;
}
void MeshComponent::setMesh(MeshConstPtr mesh)
{
m_mesh = mesh;
}
void MeshComponent::render(const fMatrix4& transParent, RenderQueue& queue) const
{
SceneComponent::render(transParent, queue);
int32_t primitiveCounts = m_mesh->getPrimitiveCounts();
for (int32_t i = 0; i < primitiveCounts; i++)
{
Mesh::PrimitiveConstPtr primitivePtr = m_mesh->getPrimitive(i);
RenderablePtr renderable = std::make_shared<RenderableEntity>(primitivePtr, transParent);
queue.pushRenderable(renderable);
}
}
DV_CORE_END_NAMESPACE
+123
View File
@@ -0,0 +1,123 @@
#include "scene/dvc_scene.h"
#include "scene/dvc_scene_node.h"
#include "device/dvc_buffer.h"
#include "device/dvc_buffer_view.h"
#include "device/dvc_buffer_accessor.h"
#include "scene/component/dvc_camera_component.h"
DV_CORE_BEGIN_NAMESPACE
Scene::Scene()
{
}
Scene::~Scene()
{
clear();
}
void Scene::init(void)
{
//clear
clear();
//set a new root
m_rootSceneNode = std::shared_ptr<SceneNode>(new SceneNode());
}
void Scene::clear(void)
{
//clear scene nodes
if (m_rootSceneNode.get())
{
m_rootSceneNode->clear();
}
m_rootSceneNode = nullptr;
//clear assets
m_meshArray.clear();
//clear device resources
m_bufferAccessorArray.clear();
m_bufferViewArray.clear();
m_deviceBufferArray.clear();
}
DeviceBufferPtr Scene::newDeviceBuffer()
{
DeviceBufferPtr deviceBuffer = std::make_shared<DeviceBuffer>();
m_deviceBufferArray.push_back(deviceBuffer);
return deviceBuffer;
}
DeviceBufferConstPtr Scene::getDeviceBuffer(int32_t index) const
{
if (index < 0 || index >= m_deviceBufferArray.size())
{
return nullptr;
}
return m_deviceBufferArray[index];
}
DeviceBufferViewPtr Scene::newDeviceBufferView(DeviceBufferConstPtr buffer, size_t offset, size_t length, size_t stride)
{
DeviceBufferViewPtr deviceBufferView = std::make_shared<DeviceBufferView>(buffer, offset, length, stride);
m_bufferViewArray.push_back(deviceBufferView);
return deviceBufferView;
}
DeviceBufferViewPtr Scene::getDeviceBufferView(int32_t index) const
{
if (index < 0 || index >= m_bufferViewArray.size())
{
return nullptr;
}
return m_bufferViewArray[index];
}
DeviceBufferAccessorPtr Scene::newDeviceBufferAccessor(DeviceBufferViewConstPtr bufferView, size_t offset,
size_t count, ComponentType componentType, DataType dataType)
{
DeviceBufferAccessorPtr deviceBufferAccessor = std::make_shared<DeviceBufferAccessor>(
bufferView, offset, count, componentType, dataType);
m_bufferAccessorArray.push_back(deviceBufferAccessor);
return deviceBufferAccessor;
}
DeviceBufferAccessorPtr Scene::getDeviceBufferAccessor(int32_t index) const
{
if (index < 0 || index >= m_bufferAccessorArray.size())
{
return nullptr;
}
return m_bufferAccessorArray[index];
}
int32_t Scene::pushNewMeshAsset(MeshPtr mesh)
{
m_meshArray.push_back(mesh);
return (int32_t)(m_meshArray.size());
}
MeshConstPtr Scene::getMesh(int32_t index) const
{
if (index < 0 || index >= m_meshArray.size())
{
return nullptr;
}
return m_meshArray[index];
}
SceneNodePtr Scene::newSceneNode(const std::string& name)
{
SceneNodePtr sceneNode = std::make_shared<SceneNode>();
sceneNode->setName(name);
return sceneNode;
}
SceneNodePtr Scene::getRootSceneNode(void) const
{
return m_rootSceneNode;
}
DV_CORE_END_NAMESPACE
+108
View File
@@ -0,0 +1,108 @@
#include "scene/dvc_scene_node.h"
#include "scene/component/dvc_component.h"
DV_CORE_BEGIN_NAMESPACE
SceneNode::SceneNode()
: m_transform(fMatrix4::IDENTITY)
{
}
SceneNode::~SceneNode()
{
}
void SceneNode::setName(const std::string& name)
{
m_name = name;
}
const std::string& SceneNode::getName() const
{
return m_name;
}
void SceneNode::clear(void)
{
for (size_t i = 0; i < m_childen.size(); i++)
{
m_childen[i]->clear();
}
m_childen.clear();
}
void SceneNode::addChild(SceneNodePtr child)
{
child->setParent(shared_from_this());
m_childen.push_back(child);
}
void SceneNode::setParent(SceneNodePtr parent)
{
m_parent = parent;
}
void SceneNode::addComponent(SceneComponentPtr component)
{
m_componentArray.push_back(component);
}
void SceneNode::setTransform(const fMatrix4& transform)
{
m_transform = transform;
}
fMatrix4 SceneNode::getWorldTransform() const
{
if (m_parent)
{
return m_parent->getWorldTransform() * m_transform;
}
return m_transform;
}
fVector3 SceneNode::getPosition() const
{
return getTransform() * fVector3::ZERO;
}
fVector3 SceneNode::getWorldPosition() const
{
return getWorldTransform() * fVector3::ZERO;
}
SceneNodeConstPtr SceneNode::getChild(size_t index) const
{
if (index >= getChildCounts()) {
return nullptr;
}
return m_childen[index];
}
SceneComponentConstPtr SceneNode::getComponent(size_t index) const
{
if (index >= getComponentCounts()) {
return nullptr;
}
return m_componentArray[index];
}
void SceneNode::buildRenderQueue(const fMatrix4& transParent, RenderQueue& queue)
{
fMatrix4 transform = m_transform * transParent;
for (auto component : m_componentArray)
{
component->render(transform, queue);
}
for (auto child : m_childen)
{
child->buildRenderQueue(transform, queue);
}
}
DV_CORE_END_NAMESPACE
@@ -0,0 +1,24 @@
#include "shader/dvc_shader_interface.h"
#include <Windows.h>
DV_CORE_BEGIN_NAMESPACE
ShaderFileInterface* LoadShaderFile(const char* szShaderFile)
{
HMODULE hDllModule = LoadLibraryA(szShaderFile);
if (hDllModule == NULL)
{
return nullptr;
}
ShaderFileInterfaceFunc shaderFileInterfaceFunc = (ShaderFileInterfaceFunc)GetProcAddress(hDllModule, "ShaderFileInterface");
if (shaderFileInterfaceFunc == NULL)
{
return nullptr;
}
return shaderFileInterfaceFunc();
}
DV_CORE_END_NAMESPACE