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
+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