Skip to content
Snippets Groups Projects
Commit a0751303 authored by D-AIRY's avatar D-AIRY
Browse files

Fixed level bounds; fixed model scale; bump up version

parent 8704b974
Branches
Tags version_X.1.3-dev
No related merge requests found
Showing
with 238 additions and 93 deletions
...@@ -292,7 +292,7 @@ QT стиль документирования (!) и QT_AUTOBRIEF - корот ...@@ -292,7 +292,7 @@ QT стиль документирования (!) и QT_AUTOBRIEF - корот
#ifndef __SKYXENGINE_H #ifndef __SKYXENGINE_H
#define __SKYXENGINE_H #define __SKYXENGINE_H
#define SKYXENGINE_VERSION "X.1.2-dev" #define SKYXENGINE_VERSION "X.1.3-dev"
#define SKYXENGINE_VERSION4EDITORS "SkyXEngine version " ## SKYXENGINE_VERSION #define SKYXENGINE_VERSION4EDITORS "SkyXEngine version " ## SKYXENGINE_VERSION
......
...@@ -408,7 +408,7 @@ float3 XMETHODCALLTYPE CAnimatedModel::getBoneTransformPos(UINT id) ...@@ -408,7 +408,7 @@ float3 XMETHODCALLTYPE CAnimatedModel::getBoneTransformPos(UINT id)
return(0); return(0);
} }
return(getOrientation() * ((m_pRenderFrameBones[id].position - m_pRenderFrameBones[id].orient * (float3)m_pShared->getInvertedBindPose()[id].position)) + getPosition()); return(getOrientation() * ((m_pRenderFrameBones[id].position - m_pRenderFrameBones[id].orient * (float3)m_pShared->getInvertedBindPose()[id].position)) * m_fScale + getPosition());
} }
SMQuaternion XMETHODCALLTYPE CAnimatedModel::getBoneTransformRot(UINT id) SMQuaternion XMETHODCALLTYPE CAnimatedModel::getBoneTransformRot(UINT id)
{ {
......
...@@ -172,3 +172,30 @@ void CAnimatedModelProvider::computeVisibility(const IFrustum *pFrustum, CRender ...@@ -172,3 +172,30 @@ void CAnimatedModelProvider::computeVisibility(const IFrustum *pFrustum, CRender
} }
} }
} }
void CAnimatedModelProvider::getLevelSize(const XEventLevelSize *pData)
{
CAnimatedModel *pMdl;
float3 vMax, vMin;
for(UINT i = 0, l = m_apModels.size(); i < l; ++i)
{
pMdl = m_apModels[i];
if(pMdl->isEnabled())
{
float3 vDelta = pMdl->getPosition();
vMin = pMdl->getLocalBoundMin() + vDelta;
vMax = pMdl->getLocalBoundMax() + vDelta;
if(pData->vMax == pData->vMin)
{
pData->vMax = vMax;
pData->vMin = vMin;
}
else
{
pData->vMax = SMVectorMax(pData->vMax, vMax);
pData->vMin = SMVectorMin(pData->vMin, vMin);
}
}
}
}
...@@ -28,6 +28,8 @@ public: ...@@ -28,6 +28,8 @@ public:
void render(CRenderableVisibility *pVisibility = NULL); void render(CRenderableVisibility *pVisibility = NULL);
void computeVisibility(const IFrustum *pFrustum, CRenderableVisibility *pVisibility, CRenderableVisibility *pReference=NULL); void computeVisibility(const IFrustum *pFrustum, CRenderableVisibility *pVisibility, CRenderableVisibility *pReference=NULL);
void getLevelSize(const XEventLevelSize *pData);
protected: protected:
AssotiativeArray<IXResourceModelAnimated*, Array<CAnimatedModelShared*>> m_mModels; AssotiativeArray<IXResourceModelAnimated*, Array<CAnimatedModelShared*>> m_mModels;
......
...@@ -134,3 +134,31 @@ void CDynamicModelProvider::computeVisibility(const IFrustum *pFrustum, CRendera ...@@ -134,3 +134,31 @@ void CDynamicModelProvider::computeVisibility(const IFrustum *pFrustum, CRendera
} }
} }
} }
void CDynamicModelProvider::getLevelSize(const XEventLevelSize *pData)
{
CDynamicModel *pMdl;
float3 vMax, vMin;
for(UINT i = 0, l = m_apModels.size(); i < l; ++i)
{
pMdl = m_apModels[i];
if(pMdl->isEnabled())
{
float3 vDelta = pMdl->getPosition();
vMin = pMdl->getLocalBoundMin() + vDelta;
vMax = pMdl->getLocalBoundMax() + vDelta;
if(pData->vMax == pData->vMin)
{
pData->vMax = vMax;
pData->vMin = vMin;
}
else
{
pData->vMax = SMVectorMax(pData->vMax, vMax);
pData->vMin = SMVectorMin(pData->vMin, vMin);
}
}
}
}
...@@ -26,6 +26,8 @@ public: ...@@ -26,6 +26,8 @@ public:
void render(CRenderableVisibility *pVisibility = NULL); void render(CRenderableVisibility *pVisibility = NULL);
void computeVisibility(const IFrustum *pFrustum, CRenderableVisibility *pVisibility, CRenderableVisibility *pReference=NULL); void computeVisibility(const IFrustum *pFrustum, CRenderableVisibility *pVisibility, CRenderableVisibility *pReference=NULL);
void getLevelSize(const XEventLevelSize *pData);
protected: protected:
AssotiativeArray<IXResourceModel*, CDynamicModelShared*> m_mModels; AssotiativeArray<IXResourceModel*, CDynamicModelShared*> m_mModels;
......
#include <xcommon/IXPlugin.h> #include <xcommon/IXPlugin.h>
#include <xcommon/XEvents.h>
#include "Renderable.h" #include "Renderable.h"
#include "Updatable.h" #include "Updatable.h"
#include "AnimatedModelProvider.h" #include "AnimatedModelProvider.h"
#include "DynamicModelProvider.h" #include "DynamicModelProvider.h"
class CLevelSizeEventListener: public IEventListener<XEventLevelSize>
{
public:
CLevelSizeEventListener(CAnimatedModelProvider *pAnimatedModelProvider, CDynamicModelProvider *pDynamicModelProvider):
m_pAnimatedModelProvider(pAnimatedModelProvider),
m_pDynamicModelProvider(pDynamicModelProvider)
{
}
void onEvent(const XEventLevelSize *pData)
{
m_pDynamicModelProvider->getLevelSize(pData);
m_pAnimatedModelProvider->getLevelSize(pData);
}
protected:
CAnimatedModelProvider *m_pAnimatedModelProvider;
CDynamicModelProvider *m_pDynamicModelProvider;
};
class CDSEPlugin: public IXPlugin class CDSEPlugin: public IXPlugin
{ {
public: public:
void XMETHODCALLTYPE startup(IXCore *pCore) override void XMETHODCALLTYPE startup(IXCore *pCore) override
{ {
m_pCore = pCore;
m_pAnimatedModelProvider = new CAnimatedModelProvider(pCore); m_pAnimatedModelProvider = new CAnimatedModelProvider(pCore);
m_pDynamicModelProvider = new CDynamicModelProvider(pCore); m_pDynamicModelProvider = new CDynamicModelProvider(pCore);
m_pRenderable = new CRenderable(getID(), m_pAnimatedModelProvider, m_pDynamicModelProvider); m_pRenderable = new CRenderable(getID(), m_pAnimatedModelProvider, m_pDynamicModelProvider);
m_pUpdatable = new CUpdatable(m_pAnimatedModelProvider); m_pUpdatable = new CUpdatable(m_pAnimatedModelProvider);
m_pLevelSizeEventListener = new CLevelSizeEventListener(m_pAnimatedModelProvider, m_pDynamicModelProvider);
m_pCore->getEventChannel<XEventLevelSize>(EVENT_LEVEL_GET_SIZE_GUID)->addListener(m_pLevelSizeEventListener);
} }
void XMETHODCALLTYPE shutdown() override void XMETHODCALLTYPE shutdown() override
{ {
m_pCore->getEventChannel<XEventLevelSize>(EVENT_LEVEL_GET_SIZE_GUID)->removeListener(m_pLevelSizeEventListener);
mem_delete(m_pLevelSizeEventListener);
mem_delete(m_pRenderable); mem_delete(m_pRenderable);
mem_delete(m_pUpdatable); mem_delete(m_pUpdatable);
mem_delete(m_pAnimatedModelProvider); mem_delete(m_pAnimatedModelProvider);
...@@ -74,8 +99,10 @@ public: ...@@ -74,8 +99,10 @@ public:
protected: protected:
CRenderable *m_pRenderable = NULL; CRenderable *m_pRenderable = NULL;
CUpdatable *m_pUpdatable = NULL; CUpdatable *m_pUpdatable = NULL;
IXCore *m_pCore = NULL;
CAnimatedModelProvider *m_pAnimatedModelProvider = NULL; CAnimatedModelProvider *m_pAnimatedModelProvider = NULL;
CDynamicModelProvider *m_pDynamicModelProvider = NULL; CDynamicModelProvider *m_pDynamicModelProvider = NULL;
CLevelSizeEventListener *m_pLevelSizeEventListener = NULL;
}; };
DECLARE_XPLUGIN(CDSEPlugin); DECLARE_XPLUGIN(CDSEPlugin);
...@@ -31,7 +31,7 @@ CResourceManager::CResourceManager(IXCore *pCore): ...@@ -31,7 +31,7 @@ CResourceManager::CResourceManager(IXCore *pCore):
strlwr(const_cast<char*>(sExt.getName())); strlwr(const_cast<char*>(sExt.getName()));
sExt.setName(pLoader->getExt(i)); sExt.setName(pLoader->getExt(i));
m_mapModelLoaders[sExt].push_back(pLoader); m_mapModelLoaders[sExt].push_back(pLoader);
m_aModelExts.push_back({pLoader->getDescription(), pLoader->getExt(i)}); m_aModelExts.push_back({pLoader->getExtText(i), pLoader->getExt(i)});
} }
} }
} }
......
...@@ -204,3 +204,8 @@ IModelPhysboxCapsule * XMETHODCALLTYPE CResourceModel::newPhysboxCapsule() const ...@@ -204,3 +204,8 @@ IModelPhysboxCapsule * XMETHODCALLTYPE CResourceModel::newPhysboxCapsule() const
{ {
return(new CModelPhysboxCapsule()); return(new CModelPhysboxCapsule());
} }
void XMETHODCALLTYPE CResourceModel::setLocalAABB(const float3 &vMin, const float3 &vMax)
{
//! @todo: implement me!
}
...@@ -48,6 +48,8 @@ public: ...@@ -48,6 +48,8 @@ public:
IModelPhysboxCylinder * XMETHODCALLTYPE newPhysboxCylinder() const override; IModelPhysboxCylinder * XMETHODCALLTYPE newPhysboxCylinder() const override;
IModelPhysboxCapsule * XMETHODCALLTYPE newPhysboxCapsule() const override; IModelPhysboxCapsule * XMETHODCALLTYPE newPhysboxCapsule() const override;
void XMETHODCALLTYPE setLocalAABB(const float3 &vMin, const float3 &vMax) override;
void setFileName(const char *szFilename); void setFileName(const char *szFilename);
const char *getFileName() const; const char *getFileName() const;
......
#include "ModelLoader.h" #include "ModelLoader.h"
#include "ModelFile.h" #include "ModelFile.h"
UINT CModelLoader::getVersion() UINT XMETHODCALLTYPE CModelLoader::getVersion()
{ {
return(IXMODELLOADER_VERSION); return(IXMODELLOADER_VERSION);
} }
UINT CModelLoader::getExtCount() const UINT XMETHODCALLTYPE CModelLoader::getExtCount() const
{ {
return(1); return(1);
} }
const char *CModelLoader::getExt(UINT uIndex) const const char* XMETHODCALLTYPE CModelLoader::getExt(UINT uIndex) const
{ {
assert(uIndex < getExtCount()); assert(uIndex < getExtCount());
switch(uIndex) switch(uIndex)
...@@ -20,20 +20,36 @@ const char *CModelLoader::getExt(UINT uIndex) const ...@@ -20,20 +20,36 @@ const char *CModelLoader::getExt(UINT uIndex) const
} }
return(NULL); return(NULL);
} }
const char *CModelLoader::getAuthor() const const char* XMETHODCALLTYPE CModelLoader::getExtText(UINT uIndex) const
{
assert(uIndex < getExtCount());
switch(uIndex)
{
case 0:
return("SkyXEngine model");
}
return(NULL);
}
const char* XMETHODCALLTYPE CModelLoader::getAuthor() const
{ {
return("D-AIRY @ DogmaNet"); return("D-AIRY @ DogmaNet");
} }
const char *CModelLoader::getCopyright() const const char* XMETHODCALLTYPE CModelLoader::getCopyright() const
{ {
return("Copyright © Vitaliy Buturlin, Evgeny Danilovich, 2019"); return("Copyright © Vitaliy Buturlin, Evgeny Danilovich, 2019");
} }
const char *CModelLoader::getDescription() const const char* XMETHODCALLTYPE CModelLoader::getDescription() const
{ {
return("DSE model loader"); return("DSE model loader");
} }
bool CModelLoader::open(IFile *pFile) void XMETHODCALLTYPE CModelLoader::getInfo(XModelInfo *pModelInfo)
{
assert(!"Not implemented!");
//! @todo Implement me!
}
bool XMETHODCALLTYPE CModelLoader::open(IFile *pFile)
{ {
assert(!m_pCurrentFile && "File already opened!"); assert(!m_pCurrentFile && "File already opened!");
if(m_pCurrentFile) if(m_pCurrentFile)
...@@ -66,11 +82,11 @@ bool CModelLoader::open(IFile *pFile) ...@@ -66,11 +82,11 @@ bool CModelLoader::open(IFile *pFile)
return(true); return(true);
} }
XMODELTYPE CModelLoader::getType() const XMODELTYPE XMETHODCALLTYPE CModelLoader::getType() const
{ {
return((m_hdr.iFlags & MODEL_FLAG_STATIC) ? XMT_STATIC : XMT_ANIMATED); return((m_hdr.iFlags & MODEL_FLAG_STATIC) ? XMT_STATIC : XMT_ANIMATED);
} }
bool CModelLoader::loadAsStatic(IXResourceModelStatic *pResource) bool XMETHODCALLTYPE CModelLoader::loadAsStatic(IXResourceModelStatic *pResource)
{ {
if(!loadGeneric(pResource)) if(!loadGeneric(pResource))
{ {
...@@ -218,7 +234,7 @@ bool CModelLoader::loadAsStatic(IXResourceModelStatic *pResource) ...@@ -218,7 +234,7 @@ bool CModelLoader::loadAsStatic(IXResourceModelStatic *pResource)
return(true); return(true);
} }
bool CModelLoader::loadAsAnimated(IXResourceModelAnimated *pResource) bool XMETHODCALLTYPE CModelLoader::loadAsAnimated(IXResourceModelAnimated *pResource)
{ {
if(getType() != XMT_ANIMATED) if(getType() != XMT_ANIMATED)
{ {
...@@ -359,7 +375,7 @@ bool CModelLoader::loadAsAnimated(IXResourceModelAnimated *pResource) ...@@ -359,7 +375,7 @@ bool CModelLoader::loadAsAnimated(IXResourceModelAnimated *pResource)
} }
for(UINT k = 0; k < pSubSet->iVertexCount; ++k) for(UINT k = 0; k < pSubSet->iVertexCount; ++k)
{ {
pSubSet->pVertices[k].vPos = (float3)(pSubSet->pVertices[k].vPos * 0.0254f); pSubSet->pVertices[k].vPos = /*(float3)(*/pSubSet->pVertices[k].vPos/* * 0.0254f)*/;
} }
} }
} }
...@@ -388,7 +404,7 @@ bool CModelLoader::loadAsAnimated(IXResourceModelAnimated *pResource) ...@@ -388,7 +404,7 @@ bool CModelLoader::loadAsAnimated(IXResourceModelAnimated *pResource)
{ {
m_pCurrentFile->readBin(&mbn, sizeof(ModelBoneName)); m_pCurrentFile->readBin(&mbn, sizeof(ModelBoneName));
assert(i == mbn.bone.id); assert(i == mbn.bone.id);
pResource->setBoneInfo(i, mbn.szName, mbn.bone.pid, mbn.bone.position * 0.0254f, mbn.bone.orient); pResource->setBoneInfo(i, mbn.szName, mbn.bone.pid, mbn.bone.position/* * 0.0254f*/, mbn.bone.orient);
} }
} }
...@@ -459,7 +475,7 @@ bool CModelLoader::loadAsAnimated(IXResourceModelAnimated *pResource) ...@@ -459,7 +475,7 @@ bool CModelLoader::loadAsAnimated(IXResourceModelAnimated *pResource)
m_pCurrentFile->readBin(&mb, sizeof(ModelBone)); m_pCurrentFile->readBin(&mb, sizeof(ModelBone));
pSequence->m_ppSequenceData[j][k].orient = mb.orient; pSequence->m_ppSequenceData[j][k].orient = mb.orient;
pSequence->m_ppSequenceData[j][k].position = (float3)(mb.position * 0.0254f); pSequence->m_ppSequenceData[j][k].position = /*(float3)(*/mb.position/* * 0.0254f)*/;
} }
} }
} }
...@@ -503,7 +519,7 @@ bool CModelLoader::loadAsAnimated(IXResourceModelAnimated *pResource) ...@@ -503,7 +519,7 @@ bool CModelLoader::loadAsAnimated(IXResourceModelAnimated *pResource)
return(true); return(true);
} }
void CModelLoader::close() void XMETHODCALLTYPE CModelLoader::close()
{ {
m_pCurrentFile = NULL; m_pCurrentFile = NULL;
} }
......
...@@ -11,6 +11,7 @@ public: ...@@ -11,6 +11,7 @@ public:
UINT XMETHODCALLTYPE getExtCount() const override; UINT XMETHODCALLTYPE getExtCount() const override;
const char* XMETHODCALLTYPE getExt(UINT uIndex) const override; const char* XMETHODCALLTYPE getExt(UINT uIndex) const override;
const char* XMETHODCALLTYPE getExtText(UINT uIndex) const override;
const char* XMETHODCALLTYPE getAuthor() const override; const char* XMETHODCALLTYPE getAuthor() const override;
const char* XMETHODCALLTYPE getCopyright() const override; const char* XMETHODCALLTYPE getCopyright() const override;
const char* XMETHODCALLTYPE getDescription() const override; const char* XMETHODCALLTYPE getDescription() const override;
...@@ -19,7 +20,7 @@ public: ...@@ -19,7 +20,7 @@ public:
XMODELTYPE XMETHODCALLTYPE getType() const override; XMODELTYPE XMETHODCALLTYPE getType() const override;
bool XMETHODCALLTYPE loadAsStatic(IXResourceModelStatic *pResource) override; bool XMETHODCALLTYPE loadAsStatic(IXResourceModelStatic *pResource) override;
bool XMETHODCALLTYPE loadAsAnimated(IXResourceModelAnimated *pResource) override; bool XMETHODCALLTYPE loadAsAnimated(IXResourceModelAnimated *pResource) override;
// void XMETHODCALLTYPE getInfo() override; // ?? void XMETHODCALLTYPE getInfo(XModelInfo *pModelInfo) override;
void XMETHODCALLTYPE close() override; void XMETHODCALLTYPE close() override;
......
...@@ -16,25 +16,22 @@ See the license in LICENSE ...@@ -16,25 +16,22 @@ See the license in LICENSE
BEGIN_PROPTABLE(CBaseAnimating) BEGIN_PROPTABLE(CBaseAnimating)
//! Файл модели. Поддерживаются статические и анимированные модели //! Файл модели. Поддерживаются статические и анимированные модели
DEFINE_FIELD_STRING(m_szModelFile, 0, "model", "Model file", EDITOR_FILEFIELD) DEFINE_FIELD_STRINGFN(m_szModelFile, 0, "model", "Model file", setModel, EDITOR_MODEL)
FILE_OPTION("Select model", "dse")
EDITOR_FILE_END()
//! Масштаб модели //! Масштаб модели
// DEFINE_FIELD_FLOAT(m_fBaseScale, 0, "scale", "Scale", EDITOR_TEXTFIELD) DEFINE_FIELD_FLOATFN(m_fBaseScale, 0, "scale", "Scale", setScale, EDITOR_TEXTFIELD)
//! Объект референса для цвета свечения //! Объект референса для цвета свечения
DEFINE_FIELD_ENTITY(m_pEntColorRef, 0, "glow_color_ref", "Glow color reference", EDITOR_TEXTFIELD) DEFINE_FIELD_ENTITY(m_pEntColorRef, 0, "glow_color_ref", "Glow color reference", EDITOR_TEXTFIELD)
//! Цвет свечения //! Цвет свечения
DEFINE_FIELD_VECTOR(m_vGlowColor, 0, "glow_color", "Glow color", EDITOR_TEXTFIELD) DEFINE_FIELD_VECTOR(m_vGlowColor, 0, "glow_color", "Glow color", EDITOR_TEXTFIELD)
DEFINE_FIELD_BOOLFN(m_isStatic, 0, "is_static", "Is static", onIsStaticChange, EDITOR_COMBOBOX) DEFINE_FIELD_BOOLFN(m_isStatic, 0, "is_static", "Is static", onIsStaticChange, EDITOR_YESNO)
COMBO_OPTION("Yes", "1")
COMBO_OPTION("No", "0")
EDITOR_COMBO_END()
DEFINE_FIELD_INTFN(m_iSkin, 0, "skin", "Skin", setSkin, EDITOR_TEXTFIELD) DEFINE_FIELD_INTFN(m_iSkin, 0, "skin", "Skin", setSkin, EDITOR_TEXTFIELD)
DEFINE_FIELD_BOOLFN(m_useAutoPhysbox, 0, "auto_physbox", "Auto generate physbox", onSetUseAutoPhysbox, EDITOR_YESNO)
DEFINE_INPUT(inputPlayAnim, "playAnim", "Play animation", PDF_STRING) DEFINE_INPUT(inputPlayAnim, "playAnim", "Play animation", PDF_STRING)
DEFINE_INPUT(inputPlayAnimNext, "playAnimNext", "Play animation next", PDF_STRING) DEFINE_INPUT(inputPlayAnimNext, "playAnimNext", "Play animation next", PDF_STRING)
...@@ -76,26 +73,14 @@ void CBaseAnimating::getMinMax(float3 * min, float3 * max) ...@@ -76,26 +73,14 @@ void CBaseAnimating::getMinMax(float3 * min, float3 * max)
} }
}*/ }*/
bool CBaseAnimating::setKV(const char * name, const char * value) void CBaseAnimating::onSetUseAutoPhysbox(bool use)
{
if(!BaseClass::setKV(name, value))
{ {
return(false); if(m_useAutoPhysbox != use)
}
if(!strcmp(name, "model"))
{
setModel(value);
}
/*else if(!strcmp(name, "scale"))
{ {
m_useAutoPhysbox = use;
releasePhysics(); releasePhysics();
if(m_pAnimPlayer)
{
m_pAnimPlayer->setScale(m_fBaseScale);
}
initPhysics(); initPhysics();
}*/ }
return(true);
} }
void CBaseAnimating::setModel(const char * mdl) void CBaseAnimating::setModel(const char * mdl)
...@@ -119,6 +104,7 @@ void CBaseAnimating::setModel(const char * mdl) ...@@ -119,6 +104,7 @@ void CBaseAnimating::setModel(const char * mdl)
{ {
m_pModel = pModel; m_pModel = pModel;
m_pModel->setSkin(m_iSkin); m_pModel->setSkin(m_iSkin);
m_pModel->setScale(m_fBaseScale);
} }
mem_release(pResource); mem_release(pResource);
} }
...@@ -126,6 +112,18 @@ void CBaseAnimating::setModel(const char * mdl) ...@@ -126,6 +112,18 @@ void CBaseAnimating::setModel(const char * mdl)
initPhysics(); initPhysics();
} }
void CBaseAnimating::setScale(float fScale)
{
m_fBaseScale = fScale;
releasePhysics();
if(m_pModel)
{
m_pModel->setScale(m_fBaseScale);
}
initPhysics();
}
float3 CBaseAnimating::getAttachmentPos(int id) float3 CBaseAnimating::getAttachmentPos(int id)
{ {
float3 pos; float3 pos;
...@@ -218,16 +216,16 @@ void CBaseAnimating::initPhysics() ...@@ -218,16 +216,16 @@ void CBaseAnimating::initPhysics()
switch(pPhysbox->getType()) switch(pPhysbox->getType())
{ {
case XPBT_BOX: case XPBT_BOX:
pLocalShape = new btBoxShape(F3_BTVEC(pPhysbox->asBox()->getSize())); pLocalShape = new btBoxShape(F3_BTVEC(pPhysbox->asBox()->getSize()) * m_fBaseScale);
break; break;
case XPBT_SPHERE: case XPBT_SPHERE:
pLocalShape = new btSphereShape(pPhysbox->asSphere()->getRadius()); pLocalShape = new btSphereShape(pPhysbox->asSphere()->getRadius() * m_fBaseScale);
break; break;
case XPBT_CAPSULE: case XPBT_CAPSULE:
pLocalShape = new btCapsuleShape(pPhysbox->asCapsule()->getRadius(), pPhysbox->asCapsule()->getHeight()); pLocalShape = new btCapsuleShape(pPhysbox->asCapsule()->getRadius() * m_fBaseScale, pPhysbox->asCapsule()->getHeight() * m_fBaseScale);
break; break;
case XPBT_CYLINDER: case XPBT_CYLINDER:
pLocalShape = new btCylinderShape(btVector3(pPhysbox->asCylinder()->getRadius(), pPhysbox->asCylinder()->getHeight() * 0.5f, pPhysbox->asCylinder()->getRadius())); pLocalShape = new btCylinderShape(btVector3(pPhysbox->asCylinder()->getRadius(), pPhysbox->asCylinder()->getHeight() * 0.5f, pPhysbox->asCylinder()->getRadius()) * m_fBaseScale);
break; break;
case XPBT_CONVEX: case XPBT_CONVEX:
{ {
...@@ -237,6 +235,10 @@ void CBaseAnimating::initPhysics() ...@@ -237,6 +235,10 @@ void CBaseAnimating::initPhysics()
btVector3 *pData; btVector3 *pData;
int iVertexCount; int iVertexCount;
SPhysics_BuildHull(&tmpShape, &pData, &iVertexCount); SPhysics_BuildHull(&tmpShape, &pData, &iVertexCount);
for(int i = 0; i < iVertexCount; ++i)
{
pData[i] *= m_fBaseScale;
}
pLocalShape = new btConvexHullShape((float*)pData, iVertexCount, sizeof(btVector3)); pLocalShape = new btConvexHullShape((float*)pData, iVertexCount, sizeof(btVector3));
SPhysics_ReleaseHull(pData, iVertexCount); SPhysics_ReleaseHull(pData, iVertexCount);
} }
...@@ -245,11 +247,11 @@ void CBaseAnimating::initPhysics() ...@@ -245,11 +247,11 @@ void CBaseAnimating::initPhysics()
if(pLocalShape) if(pLocalShape)
{ {
btTransform localTransform(Q4_BTQUAT(pPhysbox->getOrientation()), F3_BTVEC(pPhysbox->getPosition())); btTransform localTransform(Q4_BTQUAT(pPhysbox->getOrientation()), F3_BTVEC(pPhysbox->getPosition()) * m_fBaseScale);
pShape->addChildShape(localTransform, pLocalShape); pShape->addChildShape(localTransform, pLocalShape);
} }
} }
if(!uShapesCount) if(!uShapesCount && m_useAutoPhysbox)
{ {
{ {
auto pResource = m_pModel->getResource()->asStatic(); auto pResource = m_pModel->getResource()->asStatic();
...@@ -266,6 +268,10 @@ void CBaseAnimating::initPhysics() ...@@ -266,6 +268,10 @@ void CBaseAnimating::initPhysics()
btVector3 *pData; btVector3 *pData;
int iVertexCount; int iVertexCount;
SPhysics_BuildHull(&tmpShape, &pData, &iVertexCount); SPhysics_BuildHull(&tmpShape, &pData, &iVertexCount);
for(int i = 0; i < iVertexCount; ++i)
{
pData[i] *= m_fBaseScale;
}
pLocalShape = new btConvexHullShape((float*)pData, iVertexCount, sizeof(btVector3)); pLocalShape = new btConvexHullShape((float*)pData, iVertexCount, sizeof(btVector3));
SPhysics_ReleaseHull(pData, iVertexCount); SPhysics_ReleaseHull(pData, iVertexCount);
...@@ -294,6 +300,10 @@ void CBaseAnimating::initPhysics() ...@@ -294,6 +300,10 @@ void CBaseAnimating::initPhysics()
btVector3 *pData; btVector3 *pData;
int iVertexCount; int iVertexCount;
SPhysics_BuildHull(&tmpShape, &pData, &iVertexCount); SPhysics_BuildHull(&tmpShape, &pData, &iVertexCount);
for(int i = 0; i < iVertexCount; ++i)
{
pData[i] *= m_fBaseScale;
}
pLocalShape = new btConvexHullShape((float*)pData, iVertexCount, sizeof(btVector3)); pLocalShape = new btConvexHullShape((float*)pData, iVertexCount, sizeof(btVector3));
SPhysics_ReleaseHull(pData, iVertexCount); SPhysics_ReleaseHull(pData, iVertexCount);
......
...@@ -32,9 +32,8 @@ public: ...@@ -32,9 +32,8 @@ public:
void getMinMax(float3 * min, float3 * max); void getMinMax(float3 * min, float3 * max);
// void getSphere(float3 * center, float * radius); // void getSphere(float3 * center, float * radius);
bool setKV(const char * name, const char * value); virtual void setModel(const char *szMdl);
virtual void setScale(float fScale);
virtual void setModel(const char * mdl);
float3 getAttachmentPos(int id); float3 getAttachmentPos(int id);
SMQuaternion getAttachmentRot(int id); SMQuaternion getAttachmentRot(int id);
...@@ -74,8 +73,9 @@ protected: ...@@ -74,8 +73,9 @@ protected:
IXModel *m_pModel = NULL; IXModel *m_pModel = NULL;
const char * m_szModelFile; const char * m_szModelFile;
// float m_fBaseScale; float m_fBaseScale = 1.0f;
bool m_isStatic = false; bool m_isStatic = false;
bool m_useAutoPhysbox = true;
CBaseEntity *m_pEntColorRef = NULL; CBaseEntity *m_pEntColorRef = NULL;
float3_t m_vGlowColor; float3_t m_vGlowColor;
...@@ -93,7 +93,7 @@ protected: ...@@ -93,7 +93,7 @@ protected:
virtual void onAnimationStateChanged(int slot, ANIM_STATE as); virtual void onAnimationStateChanged(int slot, ANIM_STATE as);
void onIsStaticChange(bool isStatic); void onIsStaticChange(bool isStatic);
void onSetUseAutoPhysbox(bool use);
int m_iSkin = 0; int m_iSkin = 0;
struct struct
......
...@@ -29,9 +29,7 @@ BEGIN_PROPTABLE(CBaseItem) ...@@ -29,9 +29,7 @@ BEGIN_PROPTABLE(CBaseItem)
DEFINE_OUTPUT(m_onPickUp, "OnPickUp", "On pickup") DEFINE_OUTPUT(m_onPickUp, "OnPickUp", "On pickup")
DEFINE_OUTPUT(m_onDrop, "OnDrop", "On drop") DEFINE_OUTPUT(m_onDrop, "OnDrop", "On drop")
DEFINE_FIELD_STRINGFN(m_szViewModelFile, 0, "model_view", "View model file", onSetViewModel, EDITOR_FILEFIELD) DEFINE_FIELD_STRINGFN(m_szViewModelFile, 0, "model_view", "View model file", onSetViewModel, EDITOR_MODEL)
FILE_OPTION("Select model", "dse")
EDITOR_FILE_END()
END_PROPTABLE() END_PROPTABLE()
REGISTER_ENTITY_NOLISTING(CBaseItem, base_item); REGISTER_ENTITY_NOLISTING(CBaseItem, base_item);
...@@ -116,6 +114,16 @@ void CBaseItem::onModeChanged(INVENTORY_ITEM_MODE oldMode, INVENTORY_ITEM_MODE n ...@@ -116,6 +114,16 @@ void CBaseItem::onModeChanged(INVENTORY_ITEM_MODE oldMode, INVENTORY_ITEM_MODE n
} }
} }
void CBaseItem::setScale(float fScale)
{
BaseClass::setScale(fScale);
if(m_pViewModel)
{
m_pViewModel->setScale(fScale);
}
}
void CBaseItem::onSetViewModel(const char *mdl) void CBaseItem::onSetViewModel(const char *mdl)
{ {
_setStrVal(&m_szViewModelFile, mdl); _setStrVal(&m_szViewModelFile, mdl);
...@@ -168,6 +176,7 @@ void CBaseItem::onModelChanged() ...@@ -168,6 +176,7 @@ void CBaseItem::onModelChanged()
{ {
m_pViewModel->play("IDLE"); m_pViewModel->play("IDLE");
m_pViewModel->enable(m_inventoryMode == IIM_EQUIPPED); m_pViewModel->enable(m_inventoryMode == IIM_EQUIPPED);
m_pViewModel->setScale(m_fBaseScale);
} }
} }
} }
......
...@@ -50,6 +50,8 @@ protected: ...@@ -50,6 +50,8 @@ protected:
void onModelChanged(); void onModelChanged();
void onSync() override; void onSync() override;
void setScale(float fScale) override;
const char * m_szInvName; //!< Имя, отображаемое в инвентаре const char * m_szInvName; //!< Имя, отображаемое в инвентаре
bool m_bInvStackable; //!< Можно ли хранить несколько итемов в одной ячейке bool m_bInvStackable; //!< Можно ли хранить несколько итемов в одной ячейке
int m_iInvStackCurSize; //!< Количество итемов в стеке int m_iInvStackCurSize; //!< Количество итемов в стеке
......
...@@ -11,14 +11,7 @@ See the license in LICENSE ...@@ -11,14 +11,7 @@ See the license in LICENSE
*/ */
BEGIN_PROPTABLE(CPropStatic) BEGIN_PROPTABLE(CPropStatic)
//! Масштаб модели DEFINE_FIELD_BOOLFN(m_useTrimeshPhysics, 0, "use_trimesh", "Use trimesh physics", onSetUseTrimesh, EDITOR_YESNO)
DEFINE_FIELD_FLOATFN(m_fScale, 0, "scale", "Scale", onSetScale, EDITOR_TEXTFIELD)
DEFINE_FIELD_BOOLFN(m_useTrimeshPhysics, 0, "use_trimesh", "Use trimesh physics", onSetUseTrimesh, EDITOR_COMBOBOX)
COMBO_OPTION("Yes", "1")
COMBO_OPTION("No", "0")
EDITOR_COMBO_END()
END_PROPTABLE() END_PROPTABLE()
REGISTER_ENTITY(CPropStatic, prop_static); REGISTER_ENTITY(CPropStatic, prop_static);
...@@ -65,15 +58,6 @@ void CPropStatic::removePhysBody() ...@@ -65,15 +58,6 @@ void CPropStatic::removePhysBody()
mem_delete(m_pRigidBody); mem_delete(m_pRigidBody);
} }
void CPropStatic::onSetScale(float fScale)
{
m_fScale = fScale;
if(m_pModel)
{
m_pModel->setScale(fScale);
}
}
void CPropStatic::initPhysics() void CPropStatic::initPhysics()
{ {
if(!m_pModel) if(!m_pModel)
...@@ -92,6 +76,11 @@ void CPropStatic::initPhysics() ...@@ -92,6 +76,11 @@ void CPropStatic::initPhysics()
return; return;
} }
if(!m_useAutoPhysbox)
{
return;
}
btCompoundShape *pShape = new btCompoundShape(true, uShapesCount); btCompoundShape *pShape = new btCompoundShape(true, uShapesCount);
auto pResource = m_pModel->getResource()->asStatic(); auto pResource = m_pModel->getResource()->asStatic();
...@@ -105,6 +94,7 @@ void CPropStatic::initPhysics() ...@@ -105,6 +94,7 @@ void CPropStatic::initPhysics()
if(pLocalShape) if(pLocalShape)
{ {
pLocalShape->setLocalScaling(btVector3(m_fBaseScale, m_fBaseScale, m_fBaseScale));
btTransform localTransform; btTransform localTransform;
localTransform.setIdentity(); localTransform.setIdentity();
pShape->addChildShape(localTransform, pLocalShape); pShape->addChildShape(localTransform, pLocalShape);
...@@ -137,16 +127,6 @@ void CPropStatic::releasePhysics() ...@@ -137,16 +127,6 @@ void CPropStatic::releasePhysics()
} }
} }
void CPropStatic::setModel(const char *mdl)
{
BaseClass::setModel(mdl);
if(m_pModel)
{
m_pModel->setScale(m_fScale);
}
}
void CPropStatic::onSetUseTrimesh(bool use) void CPropStatic::onSetUseTrimesh(bool use)
{ {
if(m_useTrimeshPhysics != use) if(m_useTrimeshPhysics != use)
......
...@@ -25,17 +25,14 @@ public: ...@@ -25,17 +25,14 @@ public:
DECLARE_CONSTRUCTOR(); DECLARE_CONSTRUCTOR();
~CPropStatic(); ~CPropStatic();
protected:
void createPhysBody() override; void createPhysBody() override;
void removePhysBody() override; void removePhysBody() override;
void initPhysics() override; void initPhysics() override;
void releasePhysics() override; void releasePhysics() override;
void setModel(const char *mdl) override;
protected:
void onSetScale(float fScale);
void onSetUseTrimesh(bool use); void onSetUseTrimesh(bool use);
float m_fScale = 1.0f;
bool m_useTrimeshPhysics = false; bool m_useTrimeshPhysics = false;
}; };
......
...@@ -364,6 +364,8 @@ const char * GetEmptyString(); ...@@ -364,6 +364,8 @@ const char * GetEmptyString();
#define FILE_OPTION(name, value) , name, value #define FILE_OPTION(name, value) , name, value
#define EDITOR_FILE_END() , NULL)} #define EDITOR_FILE_END() , NULL)}
#define EDITOR_YESNO EDITOR_COMBOBOX COMBO_OPTION("Yes", "1") COMBO_OPTION("No", "0") EDITOR_COMBO_END()
#define EDITOR_MODEL EDITOR_FILEFIELD FILE_OPTION("Select model", "dse") EDITOR_FILE_END()
#define DEFINE_FIELD_STRING(field, flags, keyname, edname, editor) , {(fieldtype)&DataClass::field, PDF_STRING, flags, keyname, edname, editor #define DEFINE_FIELD_STRING(field, flags, keyname, edname, editor) , {(fieldtype)&DataClass::field, PDF_STRING, flags, keyname, edname, editor
#define DEFINE_FIELD_VECTOR(field, flags, keyname, edname, editor) , {(fieldtype)&DataClass::field, PDF_VECTOR, flags, keyname, edname, editor #define DEFINE_FIELD_VECTOR(field, flags, keyname, edname, editor) , {(fieldtype)&DataClass::field, PDF_VECTOR, flags, keyname, edname, editor
......
...@@ -9,11 +9,46 @@ ...@@ -9,11 +9,46 @@
#define IXMODELLOADER_GUID DEFINE_XGUID(0x8e7da1d6, 0x7965, 0x41a1, 0xbf, 0xb4, 0x7, 0xb0, 0x87, 0xe8, 0x54, 0xa1) #define IXMODELLOADER_GUID DEFINE_XGUID(0x8e7da1d6, 0x7965, 0x41a1, 0xbf, 0xb4, 0x7, 0xb0, 0x87, 0xe8, 0x54, 0xa1)
#define IXMODELLOADER_VERSION 1 #define IXMODELLOADER_VERSION 1
//! возможная информация о dse файле
struct XModelInfo
{
//! тип файла
XMODELTYPE type;
//! количество вершин
UINT uVertexCount;
//! количество индексов
UINT uIndexCount;
//! количество подгрупп
UINT uSubsetsCount;
//! количество скинов
UINT uSkinCount;
//! количество хитбоксов
UINT uHitboxCount;
//! количество костей
UINT uBoneCount;
//! количетсов анимаций
UINT uAnimationCount;
//! габариты в метрах
float3_t vDimensions;
//! центр модели в метрах
float3_t vCenter;
};
class IXModelLoader: public IXUnknown class IXModelLoader: public IXUnknown
{ {
public: public:
virtual UINT XMETHODCALLTYPE getExtCount() const = 0; virtual UINT XMETHODCALLTYPE getExtCount() const = 0;
virtual const char* XMETHODCALLTYPE getExt(UINT uIndex) const = 0; virtual const char* XMETHODCALLTYPE getExt(UINT uIndex) const = 0;
virtual const char* XMETHODCALLTYPE getExtText(UINT uIndex) const = 0;
virtual const char* XMETHODCALLTYPE getAuthor() const = 0; virtual const char* XMETHODCALLTYPE getAuthor() const = 0;
virtual const char* XMETHODCALLTYPE getCopyright() const = 0; virtual const char* XMETHODCALLTYPE getCopyright() const = 0;
virtual const char* XMETHODCALLTYPE getDescription() const = 0; virtual const char* XMETHODCALLTYPE getDescription() const = 0;
...@@ -22,7 +57,7 @@ public: ...@@ -22,7 +57,7 @@ public:
virtual XMODELTYPE XMETHODCALLTYPE getType() const = 0; virtual XMODELTYPE XMETHODCALLTYPE getType() const = 0;
virtual bool XMETHODCALLTYPE loadAsStatic(IXResourceModelStatic *pResource) = 0; virtual bool XMETHODCALLTYPE loadAsStatic(IXResourceModelStatic *pResource) = 0;
virtual bool XMETHODCALLTYPE loadAsAnimated(IXResourceModelAnimated *pResource) = 0; virtual bool XMETHODCALLTYPE loadAsAnimated(IXResourceModelAnimated *pResource) = 0;
// virtual void XMETHODCALLTYPE getInfo() = 0; // ?? virtual void XMETHODCALLTYPE getInfo(XModelInfo *pModelInfo) = 0;
virtual void XMETHODCALLTYPE close() = 0; virtual void XMETHODCALLTYPE close() = 0;
}; };
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment