mirror of
https://github.com/ptitSeb/Serious-Engine
synced 2024-11-22 10:20:26 +01:00
135 lines
4.1 KiB
C++
135 lines
4.1 KiB
C++
/* Copyright (c) 2002-2012 Croteam Ltd.
|
|
This program is free software; you can redistribute it and/or modify
|
|
it under the terms of version 2 of the GNU General Public License as published by
|
|
the Free Software Foundation
|
|
|
|
|
|
This program is distributed in the hope that it will be useful,
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
GNU General Public License for more details.
|
|
|
|
You should have received a copy of the GNU General Public License along
|
|
with this program; if not, write to the Free Software Foundation, Inc.,
|
|
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */
|
|
|
|
#include "base.h"
|
|
|
|
|
|
#define LAYER_BACKGROUND 1
|
|
#define LAYER_FOREGROUND 2
|
|
|
|
|
|
// weightmapnames
|
|
extern const char **_astrWeightMapNames;
|
|
extern int _ctWeightMapNames;
|
|
extern int _ctUsedWeightMapNames;
|
|
|
|
extern EDStateRef _state;
|
|
|
|
// points
|
|
int _ctPointsInBackground;
|
|
EDPointInfo *_ppiPoint;
|
|
|
|
int _ctGlobalCounter;
|
|
|
|
|
|
struct BackgroundPointInfo {
|
|
double position[3];
|
|
int *aiWmapIndices;
|
|
float *aiWmapWeights;
|
|
int iNumWmaps;
|
|
};
|
|
BackgroundPointInfo *_aPointsInBackground;
|
|
|
|
|
|
|
|
|
|
void ListWeightMaps() {
|
|
|
|
// list all the weightmaps used
|
|
_ctWeightMapNames = _objfunc->numVMaps(LWVMAP_WGHT);
|
|
_astrWeightMapNames = (const char**) malloc(_ctWeightMapNames*sizeof(char*));
|
|
memset(_astrWeightMapNames, 0, _ctWeightMapNames*sizeof(char*));
|
|
_ctUsedWeightMapNames = 0;
|
|
|
|
for(int iWeightMap=0; iWeightMap<_ctWeightMapNames; iWeightMap++) {
|
|
const char *strName = _objfunc->vmapName(LWVMAP_WGHT, iWeightMap);
|
|
_astrWeightMapNames[iWeightMap] = strName;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
EDError ScanBackgroundPoints (void *userdata, const EDPointInfo *ppiPointInfo) {
|
|
static float fwmapval;
|
|
|
|
_aPointsInBackground[_ctGlobalCounter].position[0] = ppiPointInfo->position[0];
|
|
_aPointsInBackground[_ctGlobalCounter].position[1] = ppiPointInfo->position[1];
|
|
_aPointsInBackground[_ctGlobalCounter].position[2] = ppiPointInfo->position[2];
|
|
|
|
_aPointsInBackground[_ctGlobalCounter].aiWmapIndices = new int[_ctWeightMapNames];
|
|
_aPointsInBackground[_ctGlobalCounter].aiWmapWeights = new float[_ctWeightMapNames];
|
|
_aPointsInBackground[_ctGlobalCounter].iNumWmaps = 0;
|
|
|
|
for (int iwmap=0;iwmap<_ctWeightMapNames;iwmap++) {
|
|
_meshEditOperations->pointVSet(_state,NULL,LWVMAP_WGHT,_astrWeightMapNames[iwmap]);
|
|
if (_meshEditOperations->pointVGet(_state,ppiPointInfo->pnt,&fwmapval)) {
|
|
_aPointsInBackground[_ctGlobalCounter].aiWmapIndices[_aPointsInBackground[_ctGlobalCounter].iNumWmaps] = iwmap;
|
|
_aPointsInBackground[_ctGlobalCounter].aiWmapWeights[_aPointsInBackground[_ctGlobalCounter].iNumWmaps] = fwmapval;
|
|
_aPointsInBackground[_ctGlobalCounter].iNumWmaps++;
|
|
}
|
|
|
|
}
|
|
|
|
_ctGlobalCounter++;
|
|
|
|
return EDERR_NONE;
|
|
};
|
|
|
|
|
|
void ScanBackground() {
|
|
_ctPointsInBackground = _meshEditOperations->pointCount(_state,OPLYR_BG,EDCOUNT_ALL);
|
|
|
|
_aPointsInBackground = new BackgroundPointInfo [_ctPointsInBackground];
|
|
_ctGlobalCounter = 0;
|
|
|
|
_meshEditOperations->pointScan(_state,ScanBackgroundPoints,NULL,OPLYR_BG);
|
|
}
|
|
|
|
|
|
void FreeMem() {
|
|
if (_aPointsInBackground != NULL) {
|
|
for (int i=0;i<_ctPointsInBackground;i++) {
|
|
if (_aPointsInBackground[i].aiWmapIndices != NULL) {
|
|
delete []_aPointsInBackground[i].aiWmapIndices;
|
|
}
|
|
if (_aPointsInBackground[i].aiWmapWeights != NULL) {
|
|
delete []_aPointsInBackground[i].aiWmapWeights;
|
|
}
|
|
}
|
|
delete []_aPointsInBackground;
|
|
}
|
|
if (_astrWeightMapNames != NULL) {
|
|
delete []_astrWeightMapNames;
|
|
}
|
|
}
|
|
|
|
|
|
EDError CopyWeightMaps (void *userdata, const EDPointInfo *ppiPointInfo)
|
|
{
|
|
|
|
for (int ctpnt=0;ctpnt<_ctPointsInBackground;ctpnt++) {
|
|
if ((fabs(ppiPointInfo->position[0] - _aPointsInBackground[ctpnt].position[0]) < 0.001f) &&
|
|
(fabs(ppiPointInfo->position[1] - _aPointsInBackground[ctpnt].position[1]) < 0.001f) &&
|
|
(fabs(ppiPointInfo->position[2] - _aPointsInBackground[ctpnt].position[2]) < 0.001f)) {
|
|
for (int iwmaps=0;iwmaps < _aPointsInBackground[ctpnt].iNumWmaps;iwmaps++) {
|
|
_meshEditOperations->pntVMap(_state,ppiPointInfo->pnt,LWVMAP_WGHT,_astrWeightMapNames[_aPointsInBackground[ctpnt].aiWmapIndices[iwmaps]],1,&_aPointsInBackground[ctpnt].aiWmapWeights[iwmaps]);
|
|
}
|
|
}
|
|
}
|
|
|
|
return EDERR_NONE;
|
|
};
|
|
|