Files
Renderive/YSGraphic_Core/RenderAble.h
T
2026-06-16 13:33:27 +08:00

195 lines
8.0 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#pragma once
#include <qlinkedlist.h>
#include <qscreen.h>
#include "GlobalTypes.h"
namespace YSG {
#define INIT_GET(className) className##Private* privateData = d(); \
className##RenderState* renderState = reinterpret_cast<className##RenderState*>(d()->getState(src)); \
struct TempData {
virtual ~TempData() = default;
};
struct RenderState {
virtual ~RenderState() = default;
RenderData *dPtr{};
SRC src();
};
struct RenderData {
SpinLock mBufferLock;
RenderAble *qPtr{};
bool mRenderStart = false;
RenderState* getState(SRC src) const {
switch (src) {
case SRC::Render: {
return mRenderState;
}
case SRC::Cache: {
return mRenderStateCache;
}
case SRC::Auto: {
return mRenderStart ? mRenderState : mRenderStateCache;
}
}
qDebug() << "RenderState* RenderData::getState(SRC src) error 不存在的枚举值" << static_cast<int>(src);
return nullptr;
}
RenderState *mRenderState{}, *mRenderStateCache{};
TempData *mTempData{}, *mTempDataCache{};
protected:
virtual void loadCache() = 0;
virtual RenderState* renderState() = 0;
virtual RenderState* renderStateCache() = 0;
virtual TempData* tempData() = 0;
virtual TempData* tempDataCache() = 0;
virtual ~RenderData() {
delete mTempData;
delete mTempDataCache;
delete mRenderState;
delete mRenderStateCache;
}
virtual void draw(QPainter* painter){}
virtual void prepareData() {
SpinLockGuard g(&mBufferLock);
//qDebug() << "qPtr->mObjectName " << qPtr->mObjectName;
loadCache();
}
virtual bool selectTest(const QPointF& pos){return false;}
virtual void plotEvent(QEvent* event){}
virtual void mousePressEvent(QMouseEvent* event) {}
virtual void mouseMoveEvent(QMouseEvent* event) {}
virtual void mouseReleaseEvent(QMouseEvent* event) {}
virtual void keyPressEvent(QKeyEvent* event){}
virtual void keyReleaseEvent(QKeyEvent* event){}
virtual void firstResizeEvent(QResizeEvent* event){}
virtual void resizeEvent(QResizeEvent* event){}
virtual void wheelEvent(QWheelEvent* event){}
friend struct RenderAble;
};
struct BaseRenderData : RenderData {
RenderState* renderState() override {return nullptr;}
RenderState* renderStateCache() override {return nullptr;}
TempData* tempData() override {return nullptr;}
TempData* tempDataCache() override {return nullptr;}
void loadCache() override{}
};
class Plot;
struct RenderAble {
virtual RenderData* createRenderData() {return new BaseRenderData;}
virtual RenderState* createRenderState(){return new RenderState;}
virtual TempData* createTempData() {return new TempData;}
virtual void init(Plot *plot, QString layerName = "");
virtual void draw(QPainter* painter){dPtr->draw(painter);}
virtual void prepareData(){dPtr->prepareData();}
virtual bool selectTest(const QPointF& pos){return dPtr->selectTest(pos);}
virtual void plotEvent(QEvent* event){dPtr->plotEvent(event);}
virtual void mousePressEvent(QMouseEvent* event) {dPtr->mousePressEvent(event);}
virtual void mouseMoveEvent(QMouseEvent* event) {dPtr->mouseMoveEvent(event);}
virtual void mouseReleaseEvent(QMouseEvent* event) {dPtr->mouseReleaseEvent(event);}
virtual void keyPressEvent(QKeyEvent* event){dPtr->keyPressEvent(event);}
virtual void keyReleaseEvent(QKeyEvent* event){dPtr->keyReleaseEvent(event);}
virtual void firstResizeEvent(QResizeEvent* event){dPtr->firstResizeEvent(event);}
virtual void resizeEvent(QResizeEvent* event){dPtr->resizeEvent(event);}
virtual void wheelEvent(QWheelEvent* event){dPtr->wheelEvent(event);};
QString mObjectName;
RenderData *dPtr{};
Plot *mPlot{};
[[nodiscard]] bool ok() const;
bool mPrepared = false;
// 这里面可以预先准备数据用来同步
virtual ~RenderAble();
virtual bool select(QPointF pos){return false;}
bool mVisable = true;
RenderAble* mParent{};
QVector<RenderAble*> mBeRelyList;
bool dectCycleRely();
private:
bool hasCycleRely(RenderAble* node, QSet<RenderAble*>& visited, QSet<RenderAble*>& recursionStack, QVector<RenderAble*>& currentPath);
};
#define Q_Ptr2(ClassName) \
ClassName##Private* d() {return reinterpret_cast<ClassName##Private*>(dPtr);} \
RenderData* createRenderData() override; \
RenderState* createRenderState() override; \
TempData* createTempData() override; \
protected: \
ClassName(); \
friend struct ClassName##Private; \
friend struct ClassName##RenderState; \
friend struct ClassName##TempData; \
public:
#define Q_Ptr(ClassName) \
ClassName(); \
ClassName##Private* d() {return reinterpret_cast<ClassName##Private*>(dPtr);} \
RenderData* createRenderData() override; \
RenderState* createRenderState() override; \
TempData* createTempData() override; \
#define Q_Ptr_cpp(ClassName) \
ClassName::ClassName() { \
dPtr = new ClassName##Private; \
mObjectName = #ClassName; \
} \
RenderData* ClassName::createRenderData() {return new ClassName##Private;} \
RenderState* ClassName::createRenderState() {return new ClassName##RenderState;} \
TempData* ClassName::createTempData() {return new ClassName##TempData;} \
#define D_Ptr_3(ClassName) \
ClassName##RenderState* renderState() override {return reinterpret_cast<ClassName##RenderState*>(mRenderState);} \
ClassName##RenderState* renderStateCache() override {return reinterpret_cast<ClassName##RenderState*>(mRenderStateCache);} \
ClassName##TempData* tempData() override {return reinterpret_cast<ClassName##TempData*>(mTempData);} \
ClassName##TempData* tempDataCache() override {return reinterpret_cast<ClassName##TempData*>(mTempDataCache);} \
friend class ClassName; \
void loadCache() override { \
*renderState() = *renderStateCache(); \
std::swap(mTempData, mTempDataCache); \
if(!mRenderStart) mRenderStart = true; \
}
#define D_Ptr(ClassName) \
ClassName* q() {return reinterpret_cast<ClassName*>(qPtr);} \
ClassName##RenderState* renderState() override {return reinterpret_cast<ClassName##RenderState*>(mRenderState);} \
ClassName##RenderState* renderStateCache() override {return reinterpret_cast<ClassName##RenderState*>(mRenderStateCache);} \
ClassName##TempData* tempData() override {return reinterpret_cast<ClassName##TempData*>(mTempData);} \
ClassName##TempData* tempDataCache() override {return reinterpret_cast<ClassName##TempData*>(mTempDataCache);} \
friend class ClassName; \
void loadCache() override { \
*renderState() = *renderStateCache(); \
std::swap(mTempData, mTempDataCache); \
if(!mRenderStart) mRenderStart = true; \
}
#define D_Ptr2(ClassName) \
ClassName* q() {return reinterpret_cast<ClassName*>(qPtr);} \
ClassName##RenderState* renderState() override {return reinterpret_cast<ClassName##RenderState*>(mRenderState);} \
ClassName##RenderState* renderStateCache() override {return reinterpret_cast<ClassName##RenderState*>(mRenderStateCache);} \
ClassName##TempData* tempData() override {return reinterpret_cast<ClassName##TempData*>(mTempData);} \
ClassName##TempData* tempDataCache() override {return reinterpret_cast<ClassName##TempData*>(mTempDataCache);} \
friend class ClassName;
#define INIT_SET(className) className##Private* pd = d(); \
className##RenderState* sc = pd->renderStateCache();\
className##TempData* td = pd->tempDataCache(); \
SpinLockGuard _guard(&pd->mBufferLock); \
}