ForCAX/entry/src/main/cpp/NativeEGLOCCT/NativeRender.cpp

199 lines
5.9 KiB
C++

#include "NativeRender.h"
#include "Aspect_TypeOfLine.hxx"
#include "STEPControl_Reader.hxx"
#ifndef NATIVE_TAG
#define NATIVE_TAG "NativeRender"
#endif
static std::mutex renderMutex;
namespace NativeOpenCAX {
NativeRender::NativeRender(int w, int h):
width(0),
height(0),
mAxis(new Axis),
nAxis(new Axis),
cr(new Camera),
ctx(new Context),
ogd(new OpenGlGraphicDriver),
ts(new TextStyle),
vw(new View),
vr(new Viewer),
win(new Window)
{
width=w;
height=h;
}
NativeRender::~NativeRender() {
shapes_.clear();
}
bool NativeRender::init(EGLCore& _eglCore) {
eglCore=_eglCore;
if(!ogd->InitOpenGlGraphicDriver(eglCore)){
HILOG_ERROR(NATIVE_TAG,"Init GraphicDriver Fail!");
return false;
}
if(!ts->InitTextStyle()){
HILOG_ERROR(NATIVE_TAG,"Init TextSyle Fail!");
return false;
}
if(!vr->InitViewer(ogd->graphicDriver)){
HILOG_ERROR(NATIVE_TAG,"Init Viewer Fail!");
return false;
}
if(!ctx->InitContext(vr->viewer)){
HILOG_ERROR(NATIVE_TAG,"Init Ctx Fail!");
return false;
}
if(!mAxis->InitAxis(ctx->context)){
HILOG_ERROR(NATIVE_TAG,"Init AXIS Fail!");
return false;
}
if(!mAxis->InitAxisCube(ctx->context)){
HILOG_ERROR(NATIVE_TAG,"Init AXIS Cuba Fail!");
return false;
}
if(!win->InitWindow(width,height)){
HILOG_ERROR(NATIVE_TAG,"Init Window Fail!");
return false;
}
if(!vw->InitView(vr->viewer)){
HILOG_ERROR(NATIVE_TAG,"Init View Fail!");
return false;
}else{
vw->SetViewOption();
vw->SetText(ts->text);
vw->SetWin(win->window);
}
if(!cr->InitCamera(vw->view)){
HILOG_ERROR(NATIVE_TAG,"Init Camera Fail!");
return false;
}
vw->ResetView();
return true;
}
bool NativeRender::loadModel(const std::string& filePath) {
// 清除现有模型
for (auto& shape : shapes_) {
ctx->context->Remove(shape, Standard_False);
}
shapes_.clear();
// 加载STEP文件
STEPControl_Reader reader;
IFSelect_ReturnStatus status = reader.ReadFile(filePath.c_str());
if (status != IFSelect_RetDone) {
printf("Error: Failed to read STEP file: %s\n", filePath.c_str());
return false;
}
// 将文件内容转换为OCCT形状
reader.TransferRoots();
int numShapes = reader.NbShapes();
if (numShapes <= 0) {
printf("Error: No shapes found in STEP file\n");
return false;
}
// 加载所有形状
for (Standard_Integer i = 1; i <= numShapes; i++) {
TopoDS_Shape shape = reader.Shape(i);
Bnd_Box bbox;
BRepBndLib::Add(shape, bbox);
double xmin, ymin, zmin, xmax, ymax, zmax;
bbox.Get(xmin, ymin, zmin, xmax, ymax, zmax);
gp_Pnt center((xmin + xmax) / 2.0, (ymin + ymax) / 2.0, (zmin + zmax) / 2.0);
gp_Vec translation(-center.X(), -center.Y(), -center.Z());
gp_Trsf move;
move.SetTranslation(translation);
BRepBuilderAPI_Transform transformer(shape, move);
shape=transformer.Shape();
if (!shape.IsNull()) {
Handle(AIS_Shape) aisShape = new AIS_Shape(shape);
// 设置材质
Handle(Prs3d_Drawer) drawer = aisShape->Attributes();
Handle(Prs3d_ShadingAspect) shadingAspect = new Prs3d_ShadingAspect();
//aisShape->SetDisplayMode(1);
Handle(Prs3d_LineAspect) aLineAspect = new Prs3d_LineAspect(
Quantity_NOC_BLACK, // 颜色,例如黑色
Aspect_TOL_DASH, // 线型
3.0 // 线宽
);
// 随机颜色
int colorIndex = i % 7;
Quantity_Color color;
switch (colorIndex) {
case 0: color = Quantity_NOC_RED; break;
case 1: color = Quantity_NOC_GREEN; break;
case 2: color = Quantity_NOC_BLUE1; break;
case 3: color = Quantity_NOC_YELLOW; break;
case 4: color = Quantity_NOC_MAGENTA1; break;
case 5: color = Quantity_NOC_CYAN1; break;
case 6: color = Quantity_NOC_ORANGE; break;
default: color = Quantity_NOC_WHITE;
}
shadingAspect->SetColor(color);
shadingAspect->SetMaterial(Graphic3d_NOM_PLASTIC);
drawer->SetFaceBoundaryDraw(Standard_True);
drawer->SetWireAspect(aLineAspect);
drawer->SetShadingAspect(shadingAspect);
ctx->context->Display(aisShape, Standard_True);
//ctx->context->SetDisplayMode(AIS_WireFrame, Standard_False);
shapes_.push_back(aisShape);
}
}
// 调整相机到合适位置
vw->view->FitAll(0.5, Standard_True);
vw->view->ZFitAll();
vw->ResetView();
OH_LOG_Print(LOG_APP, LOG_ERROR, LOG_PRINT_DOMAIN, "LoadModel","Successfully loaded STEP file with %{public}d shapes",numShapes);
return true;
}
//setTranslation
void NativeRender::setTranslation(float tx, float ty) {
nAxis->SetTranslationX(tx);
nAxis->SetTranslationY(ty);
}
void NativeRender::render() {
if (vw->view.IsNull()) {
OH_LOG_Print(LOG_APP, LOG_ERROR, LOG_PRINT_DOMAIN, "Render","View Is Null");
return;
}
vw->MustBeResized();
vw->Redraw();
}
void NativeRender::resize(int w, int h) {
HILOG_ERROR(NATIVE_TAG,"InPut Size:%{public}d,%{public}d",w,h);
win->Resize(w,h);
}
void NativeRender::setRotation(float xAngle, float yAngle) {
cr->SetRotation(xAngle, yAngle);
}
void NativeRender::setZoomLevel(float zoom) {
nAxis->SetZoomLevel(std::max(0.1f, std::min(zoom, 5.0f))); // 限制缩放范围
}
void NativeRender::setClearColor(float r, float g, float b, float a){
vw->SetClearColor( r, g, b, a);
}
void NativeRender::resetView() {
vw->ResetView();
}
void NativeRender::SwitchView(std::string view){
vw->SwitchView(view);
}
} // namespace NativeRenderer