|
@@ -30,12 +30,7 @@
|
|
|
|
|
|
#include "lightmap_raycaster.h"
|
|
|
|
|
|
-// From Embree.
|
|
|
-#include <math/vec2.h>
|
|
|
-#include <math/vec3.h>
|
|
|
-#include <xmmintrin.h>
|
|
|
-
|
|
|
-using namespace embree;
|
|
|
+#include <pmmintrin.h>
|
|
|
|
|
|
LightmapRaycaster *LightmapRaycasterEmbree::create_embree_raycaster() {
|
|
|
return memnew(LightmapRaycasterEmbree);
|
|
@@ -135,25 +130,24 @@ void LightmapRaycasterEmbree::add_mesh(const Vector<Vector3> &p_vertices, const
|
|
|
|
|
|
ERR_FAIL_COND(vertex_count % 3 != 0);
|
|
|
ERR_FAIL_COND(vertex_count != p_uv2s.size());
|
|
|
+ ERR_FAIL_COND(!p_normals.empty() && vertex_count != p_normals.size());
|
|
|
|
|
|
- Vec3fa *embree_vertices = (Vec3fa *)rtcSetNewGeometryBuffer(embree_mesh, RTC_BUFFER_TYPE_VERTEX, 0, RTC_FORMAT_FLOAT3, sizeof(Vec3fa), vertex_count);
|
|
|
- Vec2fa *embree_light_uvs = (Vec2fa *)rtcSetNewGeometryBuffer(embree_mesh, RTC_BUFFER_TYPE_VERTEX_ATTRIBUTE, 0, RTC_FORMAT_FLOAT2, sizeof(Vec2fa), vertex_count);
|
|
|
- uint32_t *embree_triangles = (uint32_t *)rtcSetNewGeometryBuffer(embree_mesh, RTC_BUFFER_TYPE_INDEX, 0, RTC_FORMAT_UINT3, sizeof(uint32_t) * 3, vertex_count / 3);
|
|
|
+ Vector3 *embree_vertices = (Vector3 *)rtcSetNewGeometryBuffer(embree_mesh, RTC_BUFFER_TYPE_VERTEX, 0, RTC_FORMAT_FLOAT3, sizeof(Vector3), vertex_count);
|
|
|
+ copymem(embree_vertices, p_vertices.ptr(), sizeof(Vector3) * vertex_count);
|
|
|
|
|
|
- Vec3fa *embree_normals = nullptr;
|
|
|
- if (!p_normals.empty()) {
|
|
|
- embree_normals = (Vec3fa *)rtcSetNewGeometryBuffer(embree_mesh, RTC_BUFFER_TYPE_VERTEX_ATTRIBUTE, 1, RTC_FORMAT_FLOAT3, sizeof(Vec3fa), vertex_count);
|
|
|
- }
|
|
|
+ Vector2 *embree_light_uvs = (Vector2 *)rtcSetNewGeometryBuffer(embree_mesh, RTC_BUFFER_TYPE_VERTEX_ATTRIBUTE, 0, RTC_FORMAT_FLOAT2, sizeof(Vector2), vertex_count);
|
|
|
+ copymem(embree_light_uvs, p_uv2s.ptr(), sizeof(Vector2) * vertex_count);
|
|
|
|
|
|
+ uint32_t *embree_triangles = (uint32_t *)rtcSetNewGeometryBuffer(embree_mesh, RTC_BUFFER_TYPE_INDEX, 0, RTC_FORMAT_UINT3, sizeof(uint32_t) * 3, vertex_count / 3);
|
|
|
for (int i = 0; i < vertex_count; i++) {
|
|
|
- embree_vertices[i] = Vec3fa(p_vertices[i].x, p_vertices[i].y, p_vertices[i].z);
|
|
|
- embree_light_uvs[i] = Vec2fa(p_uv2s[i].x, p_uv2s[i].y);
|
|
|
- if (embree_normals != nullptr) {
|
|
|
- embree_normals[i] = Vec3fa(p_normals[i].x, p_normals[i].y, p_normals[i].z);
|
|
|
- }
|
|
|
embree_triangles[i] = i;
|
|
|
}
|
|
|
|
|
|
+ if (!p_normals.empty()) {
|
|
|
+ Vector3 *embree_normals = (Vector3 *)rtcSetNewGeometryBuffer(embree_mesh, RTC_BUFFER_TYPE_VERTEX_ATTRIBUTE, 1, RTC_FORMAT_FLOAT3, sizeof(Vector3), vertex_count);
|
|
|
+ copymem(embree_normals, p_normals.ptr(), sizeof(Vector3) * vertex_count);
|
|
|
+ }
|
|
|
+
|
|
|
rtcCommitGeometry(embree_mesh);
|
|
|
rtcSetGeometryIntersectFilterFunction(embree_mesh, filter_function);
|
|
|
rtcSetGeometryUserData(embree_mesh, this);
|