/* 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;
};