MA-software-rendering/Sourse/Operator/sourse/Operator.cpp
2021-05-27 22:43:41 +03:00

398 lines
13 KiB
C++

#include "Operator.h"
_Data* Data_p;
DLLEXPORT void OPS_init(_Data* Data)
{
Data_p = Data;
}
DLLEXPORT void OPselect(int mx, int my, int width, int height)
{
_Camera* cam = &Data_p->UI.Viewport.View;
Ray ray = Ray();
ray.Pos = cam->CameraPos;
vec3f tmp = vec3f(cam->z_unit_v);
tmp *= cam->near_plane;
ray.Dir += tmp;
tmp = cam->x_unit_v;
tmp *= (width / 2.f - mx) / (width / 2.f);
ray.Dir += tmp;
tmp = cam->y_unit_v;
tmp *= (-height / 2.f + my) / (height / 2.f);
ray.Dir += tmp;
ray.Dir.unitv(&ray.Dir);
ray.shoot(&Data_p->DA_MeshObjects);
Data_p->DA_MeshObjects.active = ray.obj;
}
DLLEXPORT void OPSAddcoords()
{
if (!Data_p->DA_MeshObjects.Obj_GetLength())
{
{
float init_val[3]{ 0, 0, 0 };
Data_p->DA_MeshObjects.Obj_Add('cube');
_DAI_Object* Obj = Data_p->DA_MeshObjects.Obj_GetItem(0);
for (int i = 0; i < 8; i++)
{
Obj->Mesh.DA_Vertices->Vertex_Add(init_val);
if (i < 4) {
Obj->Mesh.DA_Vertices->Vrt_GetItem(i)->vec.y = 1;
}
}
Obj->Mesh.DA_Vertices->Vrt_GetItem(1)->vec.x = 1;
Obj->Mesh.DA_Vertices->Vrt_GetItem(2)->vec.x = 1;
Obj->Mesh.DA_Vertices->Vrt_GetItem(5)->vec.x = 1;
Obj->Mesh.DA_Vertices->Vrt_GetItem(6)->vec.x = 1;
Obj->Mesh.DA_Vertices->Vrt_GetItem(2)->vec.z = 1;
Obj->Mesh.DA_Vertices->Vrt_GetItem(3)->vec.z = 1;
Obj->Mesh.DA_Vertices->Vrt_GetItem(6)->vec.z = 1;
Obj->Mesh.DA_Vertices->Vrt_GetItem(7)->vec.z = 1;
for (int i = 0; i < 8; i++)
{
Obj->Mesh.DA_Vertices->Vrt_GetItem(i)->vec.x -= 0.5f;
Obj->Mesh.DA_Vertices->Vrt_GetItem(i)->vec.y -= 0.5f;
Obj->Mesh.DA_Vertices->Vrt_GetItem(i)->vec.z -= 0.5f;
}
for (int i = 0; i < 12; i++)
{
Obj->Mesh.DA_Trigs->DAI_Trig_Add();
}
Obj->Mesh.DA_Trigs->DAI_Trig_GetItem(0)->v1 = Obj->Mesh.DA_Vertices->Vrt_GetItem(0);
Obj->Mesh.DA_Trigs->DAI_Trig_GetItem(0)->v3 = Obj->Mesh.DA_Vertices->Vrt_GetItem(1);
Obj->Mesh.DA_Trigs->DAI_Trig_GetItem(0)->v2 = Obj->Mesh.DA_Vertices->Vrt_GetItem(2);
Obj->Mesh.DA_Trigs->DAI_Trig_GetItem(1)->v1 = Obj->Mesh.DA_Vertices->Vrt_GetItem(0);
Obj->Mesh.DA_Trigs->DAI_Trig_GetItem(1)->v3 = Obj->Mesh.DA_Vertices->Vrt_GetItem(2);
Obj->Mesh.DA_Trigs->DAI_Trig_GetItem(1)->v2 = Obj->Mesh.DA_Vertices->Vrt_GetItem(3);
Obj->Mesh.DA_Trigs->DAI_Trig_GetItem(2)->v1 = Obj->Mesh.DA_Vertices->Vrt_GetItem(0);
Obj->Mesh.DA_Trigs->DAI_Trig_GetItem(2)->v3 = Obj->Mesh.DA_Vertices->Vrt_GetItem(3);
Obj->Mesh.DA_Trigs->DAI_Trig_GetItem(2)->v2 = Obj->Mesh.DA_Vertices->Vrt_GetItem(7);
Obj->Mesh.DA_Trigs->DAI_Trig_GetItem(3)->v1 = Obj->Mesh.DA_Vertices->Vrt_GetItem(0);
Obj->Mesh.DA_Trigs->DAI_Trig_GetItem(3)->v3 = Obj->Mesh.DA_Vertices->Vrt_GetItem(7);
Obj->Mesh.DA_Trigs->DAI_Trig_GetItem(3)->v2 = Obj->Mesh.DA_Vertices->Vrt_GetItem(4);
Obj->Mesh.DA_Trigs->DAI_Trig_GetItem(4)->v1 = Obj->Mesh.DA_Vertices->Vrt_GetItem(4);
Obj->Mesh.DA_Trigs->DAI_Trig_GetItem(4)->v3 = Obj->Mesh.DA_Vertices->Vrt_GetItem(6);
Obj->Mesh.DA_Trigs->DAI_Trig_GetItem(4)->v2 = Obj->Mesh.DA_Vertices->Vrt_GetItem(5);
Obj->Mesh.DA_Trigs->DAI_Trig_GetItem(5)->v1 = Obj->Mesh.DA_Vertices->Vrt_GetItem(4);
Obj->Mesh.DA_Trigs->DAI_Trig_GetItem(5)->v3 = Obj->Mesh.DA_Vertices->Vrt_GetItem(7);
Obj->Mesh.DA_Trigs->DAI_Trig_GetItem(5)->v2 = Obj->Mesh.DA_Vertices->Vrt_GetItem(6);
Obj->Mesh.DA_Trigs->DAI_Trig_GetItem(6)->v1 = Obj->Mesh.DA_Vertices->Vrt_GetItem(4);
Obj->Mesh.DA_Trigs->DAI_Trig_GetItem(6)->v3 = Obj->Mesh.DA_Vertices->Vrt_GetItem(1);
Obj->Mesh.DA_Trigs->DAI_Trig_GetItem(6)->v2 = Obj->Mesh.DA_Vertices->Vrt_GetItem(0);
Obj->Mesh.DA_Trigs->DAI_Trig_GetItem(7)->v1 = Obj->Mesh.DA_Vertices->Vrt_GetItem(4);
Obj->Mesh.DA_Trigs->DAI_Trig_GetItem(7)->v3 = Obj->Mesh.DA_Vertices->Vrt_GetItem(5);
Obj->Mesh.DA_Trigs->DAI_Trig_GetItem(7)->v2 = Obj->Mesh.DA_Vertices->Vrt_GetItem(1);
Obj->Mesh.DA_Trigs->DAI_Trig_GetItem(8)->v1 = Obj->Mesh.DA_Vertices->Vrt_GetItem(1);
Obj->Mesh.DA_Trigs->DAI_Trig_GetItem(8)->v3 = Obj->Mesh.DA_Vertices->Vrt_GetItem(6);
Obj->Mesh.DA_Trigs->DAI_Trig_GetItem(8)->v2 = Obj->Mesh.DA_Vertices->Vrt_GetItem(2);
Obj->Mesh.DA_Trigs->DAI_Trig_GetItem(9)->v1 = Obj->Mesh.DA_Vertices->Vrt_GetItem(1);
Obj->Mesh.DA_Trigs->DAI_Trig_GetItem(9)->v3 = Obj->Mesh.DA_Vertices->Vrt_GetItem(5);
Obj->Mesh.DA_Trigs->DAI_Trig_GetItem(9)->v2 = Obj->Mesh.DA_Vertices->Vrt_GetItem(6);
Obj->Mesh.DA_Trigs->DAI_Trig_GetItem(10)->v1 = Obj->Mesh.DA_Vertices->Vrt_GetItem(2);
Obj->Mesh.DA_Trigs->DAI_Trig_GetItem(10)->v3 = Obj->Mesh.DA_Vertices->Vrt_GetItem(7);
Obj->Mesh.DA_Trigs->DAI_Trig_GetItem(10)->v2 = Obj->Mesh.DA_Vertices->Vrt_GetItem(3);
Obj->Mesh.DA_Trigs->DAI_Trig_GetItem(11)->v1 = Obj->Mesh.DA_Vertices->Vrt_GetItem(2);
Obj->Mesh.DA_Trigs->DAI_Trig_GetItem(11)->v3 = Obj->Mesh.DA_Vertices->Vrt_GetItem(6);
Obj->Mesh.DA_Trigs->DAI_Trig_GetItem(11)->v2 = Obj->Mesh.DA_Vertices->Vrt_GetItem(7);
}
{
float init_val[3]{ 0, 0, 0 };
Data_p->DA_MeshObjects.Obj_Add('plan');
_DAI_Object* Obj = Data_p->DA_MeshObjects.Obj_GetItem(1);
Obj->unit_vx.assing(1.f, 0.0f, 0.0f);
Obj->unit_vy.assing(0.0f, 1.0f, 0.0f);
Obj->unit_vz.assing(0.0f, 0.0f, 1.0f);
for (int i = 0; i < 4; i++)
{
Obj->Mesh.DA_Vertices->Vertex_Add(init_val);
}
float size = 2;
Obj->Mesh.DA_Vertices->Vrt_GetItem(0)->vec.y = size;
Obj->Mesh.DA_Vertices->Vrt_GetItem(1)->vec.y = size;
Obj->Mesh.DA_Vertices->Vrt_GetItem(2)->vec.y = -size;
Obj->Mesh.DA_Vertices->Vrt_GetItem(3)->vec.y = -size;
Obj->Mesh.DA_Vertices->Vrt_GetItem(0)->vec.x = -size;
Obj->Mesh.DA_Vertices->Vrt_GetItem(1)->vec.x = size;
Obj->Mesh.DA_Vertices->Vrt_GetItem(2)->vec.x = -size;
Obj->Mesh.DA_Vertices->Vrt_GetItem(3)->vec.x = size;
Obj->Mesh.DA_Trigs->DAI_Trig_Add();
Obj->Mesh.DA_Trigs->DAI_Trig_Add();
Obj->Mesh.DA_Trigs->DAI_Trig_GetItem(0)->v1 = Obj->Mesh.DA_Vertices->Vrt_GetItem(0);
Obj->Mesh.DA_Trigs->DAI_Trig_GetItem(0)->v2 = Obj->Mesh.DA_Vertices->Vrt_GetItem(2);
Obj->Mesh.DA_Trigs->DAI_Trig_GetItem(0)->v3 = Obj->Mesh.DA_Vertices->Vrt_GetItem(1);
Obj->Mesh.DA_Trigs->DAI_Trig_GetItem(1)->v1 = Obj->Mesh.DA_Vertices->Vrt_GetItem(3);
Obj->Mesh.DA_Trigs->DAI_Trig_GetItem(1)->v2 = Obj->Mesh.DA_Vertices->Vrt_GetItem(1);
Obj->Mesh.DA_Trigs->DAI_Trig_GetItem(1)->v3 = Obj->Mesh.DA_Vertices->Vrt_GetItem(2);
}
Data_p->Light.Dir.x = -1.f;
Data_p->Light.Dir.y = -2;
Data_p->Light.Dir.z = -3;
Data_p->Light.Dir.unitv(&Data_p->Light.Dir);
Data_p->Light.pos.x = 3;
Data_p->Light.pos.y = 3;
Data_p->Light.pos.z = 4;
}
}
DLLEXPORT void rotObj(const char direction, float angel)
{
_DAI_Object* Obj = Data_p->DA_MeshObjects.Obj_GetItem(1);
int len = Obj->Mesh.DA_Vertices->Vertices_GetLength();
switch (direction)
{
case 'x':
for (int pnt = 0; pnt < len; pnt++)
{
MATH_RotateXAroundCenter(&(Obj->Mesh.DA_Vertices->Vrt_GetItem(pnt)->vec.x), angel);
}
break;
case 'y':
for (int pnt = 0; pnt < len; pnt++)
{
MATH_RotateYAroundCenter(&(Obj->Mesh.DA_Vertices->Vrt_GetItem(pnt)->vec.x), angel);
}
break;
case 'z':
for (int pnt = 0; pnt < len; pnt++)
{
MATH_RotateZAroundCenter(&(Obj->Mesh.DA_Vertices->Vrt_GetItem(pnt)->vec.x), angel);
}
break;
}
}
DLLEXPORT void RelativeRotate(float rot_angel, float focusScale) //FIXME
{
_DAI_Object* Obj = Data_p->DA_MeshObjects.Obj_GetItem(1);
int len = Obj->Mesh.DA_Vertices->Vertices_GetLength();
float Copy[3]{ 1, -1, -1 };
MATH_MakeUnitVector(Copy);
for (int pnt = 0; pnt < len; pnt++)
{
//MATH_RotateArbAxes(&(Data_p->UI.Viewport.View.z_unit_v.x), &(Obj->Mesh.DA_Vertices->Vrt_GetItem(pnt)->vec.x), rot_angel);
}
}
DLLEXPORT void OPSdelete()
{
if (Data_p->DA_MeshObjects.active) {
int del_idx = Data_p->DA_MeshObjects.active->Obj_index;
Data_p->DA_MeshObjects.Obj_Delete(del_idx, del_idx);
Data_p->DA_MeshObjects.active = nullptr;
}
}
DLLEXPORT void OPSclear()
{
Data_p->DA_MeshObjects.Obj_Delete(-1, -1);
Data_p->DA_MeshObjects.active = nullptr;
}
DLLEXPORT void ResetCamera()
{
_Camera* cam = &Data_p->UI.Viewport.View;
cam->x_unit_v.assing(0.93f, -0.34f, 0.01);
cam->y_unit_v.assing(-.11f, -.25f, 0.95f);
cam->z_unit_v.assing(-0.33f, -0.9f, -.27f);
cam->CameraPos.assing(1.88f, 3.95f, 1.58);
cam->FocalPoint.assing(0.5f, 0.5f, 0.5f);
}
//DLLEXPORT void RotCamera(float angel, char axes, float focusScale)
DLLEXPORT void RotCamera(float angel, char axes, float focusScale) //TODO: replace with orbital rotate
{
_Camera* cam = &Data_p->UI.Viewport.View;
MATH_VectorDifference(&(cam->CameraPos.x), &(cam->CameraPos.x), &(cam->FocalPoint.x));
float vec[3]{ 0,0,0 };
switch (axes)
{
case 'x':
MATH_RotateArbAxes(&(cam->x_unit_v.x), vec, &(cam->y_unit_v.x), angel);
MATH_RotateArbAxes(&(cam->x_unit_v.x), vec, &(cam->z_unit_v.x), angel);
MATH_RotateArbAxes(&(cam->x_unit_v.x), vec, &(cam->CameraPos.x), angel);
break;
case 'y':
MATH_RotateZAroundCenter(&(cam->x_unit_v.x), angel);
MATH_RotateZAroundCenter(&(cam->y_unit_v.x), angel);
MATH_RotateZAroundCenter(&(cam->z_unit_v.x), angel);
MATH_RotateZAroundCenter(&(cam->CameraPos.x), angel);
break;
case 'z':
MATH_RotateArbAxes(&(cam->z_unit_v.x), vec, &(cam->x_unit_v.x), angel);
MATH_RotateArbAxes(&(cam->z_unit_v.x), vec, &(cam->y_unit_v.x), angel);
MATH_RotateArbAxes(&(cam->z_unit_v.x), vec, &(cam->CameraPos.x), angel);
break;
}
MATH_VectorSum(&(cam->CameraPos.x), &(cam->CameraPos.x), &(cam->FocalPoint.x));
}
DLLEXPORT void RotObj(float angel, char axes) //TODO: replace with orbital rotate
{
switch (axes)
{
case 'x':
//MATH_RotateArbAxes(&(Data_p->UI.Viewport.View.x_unit_v.x), &(Data_p->Light.Dir.x), angel);
break;
case 'y':
//MATH_RotateArbAxes(&(Data_p->UI.Viewport.View.y_unit_v.x), &(Data_p->Light.Dir.x), angel);
break;
case 'z':
//MATH_RotateArbAxes(&(Data_p->UI.Viewport.View.z_unit_v.x), &(Data_p->Light.Dir.x), angel);
break;
}
}
DLLEXPORT void CameraMove(float displacement, const char direction)
{
_Camera* cam = &Data_p->UI.Viewport.View;
float h = float(Data_p->WM.win_height);
float w = float(Data_p->WM.win_width);
float Movefactor = 0;
if (h > w)
{
Movefactor = (w / h) * 10;
}
else
{
Movefactor = (h / w) * 10;
}
float displV[3];
float distance[3];
MATH_VectorDifference(distance, &(cam->CameraPos.x), &(cam->FocalPoint.x));
distance[0] = MATH_VectorMagnetude(distance);
switch (direction)
{
case 'x':
displacement *= distance[0] / Movefactor;
MATH_CopyVector(displV, &(cam->x_unit_v.x));
MATH_ScalarMultiplication(displV, displacement);
MATH_VectorSum(&(cam->FocalPoint.x), &(cam->FocalPoint.x), displV);
break;
case 'y':
displacement *= distance[0] / Movefactor;
MATH_CopyVector(displV, &(cam->y_unit_v.x));
MATH_ScalarMultiplication(displV, displacement);
MATH_VectorSum(&(cam->FocalPoint.x), &(cam->FocalPoint.x), displV);
break;
case 'z':
displacement *= (distance[0] / 3);
MATH_CopyVector(displV, &(cam->z_unit_v.x));
MATH_ScalarMultiplication(displV, displacement);
break;
}
MATH_VectorSum(&(cam->CameraPos.x), &(cam->CameraPos.x), displV);
}
// ------------------- trash --------------- //
/*
DLLEXPORT void MoveYInvert()
{
if (Data_p->DA_MeshObjects.Obj_GetLength() and Data_p->DA_MeshObjects.Obj_GetItem(0)->Mesh.DA_Vertices->Vertices_GetLength())
{
//Data_p->DA_Collection.operator[](0)->Position[0] += 0.1;
Data_p->UI.Viewport.View.CameraPos[1] -= float(0.001);
}
}
DLLEXPORT void MoveY()
{
if (Data_p->DA_MeshObjects.Obj_GetLength() and Data_p->DA_MeshObjects.Obj_GetItem(0)->Mesh.DA_Vertices->Vertices_GetLength())
{
//Data_p->DA_Collection.operator[](0)->Position[0] -= 0.1;
Data_p->UI.Viewport.View.CameraPos[1] += float(0.001);
}
}
DLLEXPORT void MoveZInvert()
{
if (Data_p->DA_MeshObjects.Obj_GetLength() and Data_p->DA_MeshObjects.Obj_GetItem(0)->Mesh.DA_Vertices->Vertices_GetLength())
{
//Data_p->DA_Collection.operator[](0)->Position[1] += 0.1;
Data_p->UI.Viewport.View.CameraPos[2] -= float(0.001);
}
}
DLLEXPORT void MoveZ()
{
if (Data_p->DA_MeshObjects.Obj_GetLength() and Data_p->DA_MeshObjects.Obj_GetItem(0)->Mesh.DA_Vertices->Vertices_GetLength())
{
//Data_p->DA_Collection.operator[](0)->Position[1] -= 0.1;
Data_p->UI.Viewport.View.CameraPos[2] += float(0.001);
}
}
DLLEXPORT void MoveXInvert()
{
if (Data_p->DA_MeshObjects.Obj_GetLength() and Data_p->DA_MeshObjects.Obj_GetItem(0)->Mesh.DA_Vertices->Vertices_GetLength())
{
//Data_p->DA_Collection.operator[](0)->Position[2] += 0.1;
Data_p->UI.Viewport.View.CameraPos[0] -= float(0.001);
}
}
DLLEXPORT void MoveX()
{
if (Data_p->DA_MeshObjects.Obj_GetLength() and Data_p->DA_MeshObjects.Obj_GetItem(0)->Mesh.DA_Vertices->Vertices_GetLength())
{
//Data_p->DA_Collection.operator[](0)->Position[2] -= 0.1;
Data_p->UI.Viewport.View.CameraPos[0] += float(0.001);
}
}
*/