Skip to content

Commit

Permalink
NC-2499: Add texture filter
Browse files Browse the repository at this point in the history
  • Loading branch information
martinweismann committed Oct 17, 2018
1 parent 2f28f89 commit ca53e4d
Show file tree
Hide file tree
Showing 17 changed files with 206 additions and 24 deletions.
4 changes: 2 additions & 2 deletions CMakeLists.txt
Expand Up @@ -8,8 +8,8 @@ project (lib3MF)

# Define Version
set(LIB3MF_VERSION_MAJOR 1) # increase on every backward-compatibility breaking change of the API
set(LIB3MF_VERSION_MINOR 7) # increase on every backward compatible change of the API
set(LIB3MF_VERSION_MICRO 3) # increase on on every change that does not alter the API
set(LIB3MF_VERSION_MINOR 8) # increase on every backward compatible change of the API
set(LIB3MF_VERSION_MICRO 0) # increase on on every change that does not alter the API

set(CMAKE_INSTALL_BINDIR bin CACHE PATH "directory for installing binary files")
set(CMAKE_INSTALL_LIBDIR lib CACHE PATH "directory for installing library files")
Expand Down
3 changes: 3 additions & 0 deletions Include/Common/NMR_ErrorConst.h
Expand Up @@ -1019,6 +1019,9 @@ Model error codes (0x8XXX)
// Invalid Tile Style
#define NMR_ERROR_INVALIDTILESTYLE 0x80C4

// Invalid Filter Style
#define NMR_ERROR_INVALIDFILTER 0x80C5

/*-------------------------------------------------------------------
XML Parser Error Constants (0x9XXX)
-------------------------------------------------------------------*/
Expand Down
2 changes: 2 additions & 0 deletions Include/Model/COM/NMR_COMInterface_ModelTexture2D.h
Expand Up @@ -68,6 +68,8 @@ namespace NMR {
LIB3MFMETHOD(SetContentType) (_In_ eModelTexture2DType eContentType);
LIB3MFMETHOD(GetTileStyleUV) (_Out_ eModelTextureTileStyle * peTileStyleU, _Out_ eModelTextureTileStyle * peTileStyleV);
LIB3MFMETHOD(SetTileStyleUV) (_In_ eModelTextureTileStyle eTileStyleU, _In_ eModelTextureTileStyle eTileStyleV);
LIB3MFMETHOD(GetFilter) (_Out_ eModelTextureFilter * peFilter);
LIB3MFMETHOD(SetFilter) (_In_ eModelTextureFilter eFilter);
LIB3MFMETHOD(GetBox2D) (_Out_ FLOAT * pfU, _Out_ FLOAT * pfV, _Out_ FLOAT * pfWidth, _Out_ FLOAT * pfHeight);
LIB3MFMETHOD(SetBox2D) (_In_ FLOAT fU, _In_ FLOAT fV, _In_ FLOAT fWidth, _In_ FLOAT fHeight);
LIB3MFMETHOD(ClearBox2D) ();
Expand Down
16 changes: 16 additions & 0 deletions Include/Model/COM/NMR_COMInterfaces.h
Expand Up @@ -1300,6 +1300,22 @@ namespace NMR {
*/
LIB3MFMETHOD(SetTileStyleUV) (_In_ eModelTextureTileStyle eTileStyleU, _In_ eModelTextureTileStyle eTileStyleV) LIB3MFABSTRACT;

/**
* Retrieves a texture's filter type
*
* @param[out] peFilter returns filter type enum
* @return error code or 0 (success)
*/
LIB3MFMETHOD(GetFilter) (_Out_ eModelTextureFilter * peFilter) LIB3MFABSTRACT;

/**
* Sets a texture's filter type
*
* @param[out] eFilter new filter type enum
* @return error code or 0 (success)
*/
LIB3MFMETHOD(SetFilter) (_In_ eModelTextureFilter eFilter) LIB3MFABSTRACT;

/**
* Retrieves a texture's box2D coordinates.
*
Expand Down
22 changes: 20 additions & 2 deletions Include/Model/COM/NMR_DLLInterfaces.h
Expand Up @@ -1375,12 +1375,30 @@ namespace NMR {
* Sets a texture's tilestyle type
*
* @param[in] pTexture2D Texture2D Resource Instance
* @param[out] eTileStyleU new tilestyle type enum
* @param[out] eTileStyleV new tilestyle type enum
* @param[in] eTileStyleU new tilestyle type enum
* @param[in] eTileStyleV new tilestyle type enum
* @return error code or 0 (success)
*/
LIB3MF_DECLSPEC LIB3MFRESULT lib3mf_texture2d_settilestyleuv(_In_ PLib3MFModelTexture2D * pTexture2D, _In_ eModelTextureTileStyle eTileStyleU, _In_ eModelTextureTileStyle eTileStyleV);

/**
* Retrieves a texture's filter
*
* @param[in] pTexture2D Texture2D Resource Instance
* @param[out] peFilter returns filter enum
* @return error code or 0 (success)
*/
LIB3MF_DECLSPEC LIB3MFRESULT lib3mf_texture2d_getfilter(_In_ PLib3MFModelTexture2D * pTexture2D, _Out_ eModelTextureFilter * peFilter);

/**
* Sets a texture's filter type
*
* @param[in] pTexture2D Texture2D Resource Instance
* @param[in] eFilter returns filter enum
* @return error code or 0 (success)
*/
LIB3MF_DECLSPEC LIB3MFRESULT lib3mf_texture2d_setfilter(_In_ PLib3MFModelTexture2D * pTexture2D, _In_ eModelTextureFilter eFilter);

/**
* Retrieves a texture's box2D coordinates.
*
Expand Down
6 changes: 5 additions & 1 deletion Include/Model/Classes/NMR_ModelConstants.h
Expand Up @@ -186,7 +186,11 @@ These are given by the 3MF Standard
#define XML_3MF_ATTRIBUTE_TEXTURE2D_TILESTYLE_WRAP "wrap"
#define XML_3MF_ATTRIBUTE_TEXTURE2D_TILESTYLE_MIRROR "mirror"
#define XML_3MF_ATTRIBUTE_TEXTURE2D_TILESTYLE_CLAMP "clamp"
#define XML_3MF_ATTRIBUTE_TEXTURE2D_TILESTYLE_NONE "none"
#define XML_3MF_ATTRIBUTE_TEXTURE2D_TILESTYLE_NONE "none"
#define XML_3MF_ATTRIBUTE_TEXTURE2D_FILTER "filter"
#define XML_3MF_ATTRIBUTE_TEXTURE2D_FILTER_AUTO "auto"
#define XML_3MF_ATTRIBUTE_TEXTURE2D_FILTER_LINEAR "linear"
#define XML_3MF_ATTRIBUTE_TEXTURE2D_FILTER_NEAREST "nearest"

// Compositematerials and composite element (not implemented!)
#define XML_3MF_ELEMENT_COMPOSITEMATERIALS "compositematerials"
Expand Down
8 changes: 8 additions & 0 deletions Include/Model/Classes/NMR_ModelTexture2D.h
Expand Up @@ -62,6 +62,7 @@ namespace NMR {
nfFloat m_fBox2D_Height;
eModelTextureTileStyle m_eTileStyleU;
eModelTextureTileStyle m_eTileStyleV;
eModelTextureFilter m_eFilter;
public:
CModelTexture2DResource() = delete;
CModelTexture2DResource(_In_ const ModelResourceID sID, _In_ CModel * pModel);
Expand All @@ -80,6 +81,7 @@ namespace NMR {
void setContentTypeString(_In_ std::string sValue, _In_ nfBool bFailIfUnknown);
void setTileStyleUString(_In_ std::string sValue);
void setTileStyleVString(_In_ std::string sValue);
void setFilterFromString(_In_ std::string sValue);

// getters/setters Box2D
nfBool getBox2D (_Out_ nfFloat & fU, _Out_ nfFloat & fV, _Out_ nfFloat & fWidth, _Out_ nfFloat & fHeight);
Expand All @@ -92,12 +94,18 @@ namespace NMR {
eModelTextureTileStyle getTileStyleV();
void setTileStyleU(_In_ eModelTextureTileStyle sStyle);
void setTileStyleV(_In_ eModelTextureTileStyle sStyle);

eModelTextureFilter getFilter();
void setFilter(_In_ eModelTextureFilter eFilter);

// copy all parameters from source
void copyFrom(_In_ CModelTexture2DResource * pSourceTexture);

static eModelTextureTileStyle tileStyleFromString(_In_ std::string sValue);
static std::string tileStyleToString(_In_ eModelTextureTileStyle eTileStyle);

static eModelTextureFilter filterFromString(_In_ std::string sValue);
static std::string filterToString(_In_ eModelTextureFilter eFilter);
};

typedef std::shared_ptr <CModelTexture2DResource> PModelTexture2DResource;
Expand Down
6 changes: 6 additions & 0 deletions Include/Model/Classes/NMR_ModelTypes.h
Expand Up @@ -154,6 +154,12 @@ namespace NMR {
MODELTEXTURETILESTYLE_NONE = 3
};

enum eModelTextureFilter {
MODELTEXTUREFILTER_AUTO = 0,
MODELTEXTUREFILTER_LINEAR = 1,
MODELTEXTUREFILTER_NEAREST = 2
};

typedef struct {
FLOAT m_fPosition[2];
} MODELSLICEVERTEX;
Expand Down
1 change: 1 addition & 0 deletions Include/Model/Reader/v093/NMR_ModelReaderNode093_Texture.h
Expand Up @@ -49,6 +49,7 @@ namespace NMR {
std::string m_sContentType;
std::string m_sTileStyleU;
std::string m_sTileStyleV;
std::string m_sFilter;

PModelTexture2DResource m_pTexture2DResource;
protected:
Expand Down
Expand Up @@ -49,6 +49,7 @@ namespace NMR {
std::string m_sContentType;
std::string m_sTileStyleU;
std::string m_sTileStyleV;
std::string m_sFilter;

nfBool m_hasBox;
nfFloat m_fU;
Expand Down
2 changes: 2 additions & 0 deletions Source/Common/NMR_Exception.cpp
Expand Up @@ -368,6 +368,8 @@ namespace NMR {
case NMR_ERROR_SLICE_ONEVERTEX: return "Slice only contains one vertex.";
case NMR_ERROR_SLICE_ONEPOINT: return "Slice contains only one point within a polygon";
case NMR_ERROR_INVALIDTILESTYLE: return "Invalid Tile Style";
case NMR_ERROR_INVALIDFILTER: return "Invalid Filter";


// XML Parser Error Constants(0x9XXX)
case NMR_ERROR_XMLPARSER_INVALIDATTRIBVALUE: return "Invalid XML attribute value";
Expand Down
43 changes: 41 additions & 2 deletions Source/Model/COM/NMR_COMInterface_ModelTexture2D.cpp
Expand Up @@ -398,6 +398,47 @@ namespace NMR {
}
}

LIB3MFMETHODIMP CCOMModelTexture2D::GetFilter(_Out_ eModelTextureFilter * peFilter)
{
try {
if (peFilter == nullptr)
throw CNMRException(NMR_ERROR_INVALIDPOINTER);

CModelTexture2DResource * pTextureResource = getTexture2D();
__NMRASSERT(pTextureResource);

*peFilter = pTextureResource->getFilter();

return handleSuccess();
}
catch (CNMRException & Exception) {
return handleNMRException(&Exception);
}
catch (...) {
return handleGenericException();
}
}

LIB3MFMETHODIMP CCOMModelTexture2D::SetFilter (_In_ eModelTextureFilter eFilter)
{
try {
CModelTexture2DResource * pTextureResource = getTexture2D();
__NMRASSERT(pTextureResource);

pTextureResource->setFilter(eFilter);

return handleSuccess();
}
catch (CNMRException & Exception) {
return handleNMRException(&Exception);
}
catch (...) {
return handleGenericException();
}
}



LIB3MFMETHODIMP CCOMModelTexture2D::GetBox2D(_Out_ FLOAT * pfU, _Out_ FLOAT * pfV, _Out_ FLOAT * pfWidth, _Out_ FLOAT * pfHeight)
{
try {
Expand Down Expand Up @@ -429,8 +470,6 @@ namespace NMR {
catch (...) {
return handleGenericException();
}


}

LIB3MFMETHODIMP CCOMModelTexture2D::SetBox2D(_In_ FLOAT fU, _In_ FLOAT fV, _In_ FLOAT fWidth, _In_ FLOAT fHeight)
Expand Down
17 changes: 17 additions & 0 deletions Source/Model/COM/NMR_DLLInterfaces.cpp
Expand Up @@ -1139,6 +1139,23 @@ namespace NMR {
return ((ILib3MFModelTexture2D *)pTexture2D)->SetTileStyleUV(eTileStyleU, eTileStyleV);
}


LIB3MF_DECLSPEC LIB3MFRESULT lib3mf_texture2d_getfilter(_In_ PLib3MFModelTexture2D * pTexture2D, _Out_ eModelTextureFilter * peFilter)
{
if (!pTexture2D)
return LIB3MF_POINTER;

return ((ILib3MFModelTexture2D *)pTexture2D)->GetFilter(peFilter);
}

LIB3MF_DECLSPEC LIB3MFRESULT lib3mf_texture2d_setfilter(_In_ PLib3MFModelTexture2D * pTexture2D, _In_ eModelTextureFilter eFilter)
{
if (!pTexture2D)
return LIB3MF_POINTER;

return ((ILib3MFModelTexture2D *)pTexture2D)->SetFilter(eFilter);
}

LIB3MF_DECLSPEC LIB3MFRESULT lib3mf_texture2d_getbox2d(_In_ PLib3MFModelTexture2D * pTexture2D, _Out_ FLOAT * pfU, _Out_ FLOAT * pfV, _Out_ FLOAT * pfWidth, _Out_ FLOAT * pfHeight)
{
if (!pTexture2D)
Expand Down
51 changes: 45 additions & 6 deletions Source/Model/Classes/NMR_ModelTexture2D.cpp
Expand Up @@ -52,6 +52,7 @@ namespace NMR {
m_fBox2D_Height = 1.0f;
m_eTileStyleU = MODELTEXTURETILESTYLE_WRAP;
m_eTileStyleV = MODELTEXTURETILESTYLE_WRAP;
m_eFilter = MODELTEXTUREFILTER_AUTO;
}

// getters/setters Path
Expand Down Expand Up @@ -129,6 +130,11 @@ namespace NMR {
m_eTileStyleV = CModelTexture2DResource::tileStyleFromString(sValue);
}

void CModelTexture2DResource::setFilterFromString(_In_ std::string sValue)
{
setFilter(CModelTexture2DResource::filterFromString(sValue));
}


// getters/setters Box2D
nfBool CModelTexture2DResource::getBox2D(_Out_ nfFloat & fU, _Out_ nfFloat & fV, _Out_ nfFloat & fWidth, _Out_ nfFloat & fHeight)
Expand Down Expand Up @@ -193,6 +199,15 @@ namespace NMR {
m_eTileStyleV = sStyle;
}

eModelTextureFilter CModelTexture2DResource::getFilter()
{
return m_eFilter;
}
void CModelTexture2DResource::setFilter(_In_ eModelTextureFilter eFilter)
{
m_eFilter = eFilter;
}

void CModelTexture2DResource::copyFrom(_In_ CModelTexture2DResource * pSourceTexture)
{
if (pSourceTexture == nullptr)
Expand Down Expand Up @@ -230,12 +245,36 @@ namespace NMR {
std::string CModelTexture2DResource::tileStyleToString(_In_ eModelTextureTileStyle eTileStyle)
{
switch (eTileStyle) {
case MODELTEXTURETILESTYLE_WRAP: return XML_3MF_ATTRIBUTE_TEXTURE2D_TILESTYLE_WRAP;
case MODELTEXTURETILESTYLE_MIRROR: return XML_3MF_ATTRIBUTE_TEXTURE2D_TILESTYLE_MIRROR;
case MODELTEXTURETILESTYLE_CLAMP: return XML_3MF_ATTRIBUTE_TEXTURE2D_TILESTYLE_CLAMP;
case MODELTEXTURETILESTYLE_NONE: return XML_3MF_ATTRIBUTE_TEXTURE2D_TILESTYLE_NONE;
default:
return XML_3MF_ATTRIBUTE_TEXTURE2D_TILESTYLE_WRAP;
case MODELTEXTURETILESTYLE_WRAP: return XML_3MF_ATTRIBUTE_TEXTURE2D_TILESTYLE_WRAP;
case MODELTEXTURETILESTYLE_MIRROR: return XML_3MF_ATTRIBUTE_TEXTURE2D_TILESTYLE_MIRROR;
case MODELTEXTURETILESTYLE_CLAMP: return XML_3MF_ATTRIBUTE_TEXTURE2D_TILESTYLE_CLAMP;
case MODELTEXTURETILESTYLE_NONE: return XML_3MF_ATTRIBUTE_TEXTURE2D_TILESTYLE_NONE;
default:
return XML_3MF_ATTRIBUTE_TEXTURE2D_TILESTYLE_WRAP;
}
}

eModelTextureFilter CModelTexture2DResource::filterFromString(_In_ std::string sValue)
{
std::transform(sValue.begin(), sValue.end(), sValue.begin(), ::tolower);
if (strcmp(sValue.c_str(), XML_3MF_ATTRIBUTE_TEXTURE2D_FILTER_AUTO) == 0)
return MODELTEXTUREFILTER_AUTO;
if (strcmp(sValue.c_str(), XML_3MF_ATTRIBUTE_TEXTURE2D_FILTER_LINEAR) == 0)
return MODELTEXTUREFILTER_LINEAR;
if (strcmp(sValue.c_str(), XML_3MF_ATTRIBUTE_TEXTURE2D_FILTER_NEAREST) == 0)
return MODELTEXTUREFILTER_NEAREST;
throw CNMRException(NMR_ERROR_INVALIDFILTER);
return MODELTEXTUREFILTER_AUTO;
}

std::string CModelTexture2DResource::filterToString(_In_ eModelTextureFilter eFilter)
{
switch (eFilter) {
case MODELTEXTUREFILTER_AUTO: return XML_3MF_ATTRIBUTE_TEXTURE2D_FILTER_AUTO;
case MODELTEXTUREFILTER_LINEAR: return XML_3MF_ATTRIBUTE_TEXTURE2D_FILTER_LINEAR;
case MODELTEXTUREFILTER_NEAREST: return XML_3MF_ATTRIBUTE_TEXTURE2D_FILTER_NEAREST;
default:
return XML_3MF_ATTRIBUTE_TEXTURE2D_FILTER_AUTO;
}
}

Expand Down
16 changes: 14 additions & 2 deletions Source/Model/Reader/v100/NMR_ModelReaderNode100_Texture2D.cpp
Expand Up @@ -95,16 +95,25 @@ namespace NMR {
throw e;
}
}
if (!m_sFilter.empty()) {
try {
m_pTexture2DResource->setFilterFromString(m_sFilter);
}
catch (CNMRException & e) {
if (e.getErrorCode() == NMR_ERROR_INVALIDFILTER)
m_pWarnings->addException(e, mrwInvalidOptionalValue);
else
throw e;
}
}

if (m_hasBox)
m_pTexture2DResource->setBox2D(m_fU, m_fV, m_fWidth, m_fHeight);
else
m_pTexture2DResource->clearBox2D();


// Parse Content
parseContent(pXMLReader);

}

void CModelReaderNode100_Texture2D::OnAttribute(_In_z_ const nfChar * pAttributeName, _In_z_ const nfChar * pAttributeValue)
Expand All @@ -131,6 +140,9 @@ namespace NMR {
else if (strcmp(pAttributeName, XML_3MF_ATTRIBUTE_TEXTURE2D_TILESTYLEV) == 0) {
m_sTileStyleV = std::string(pAttributeValue);
}
else if (strcmp(pAttributeName, XML_3MF_ATTRIBUTE_TEXTURE2D_FILTER) == 0) {
m_sFilter = std::string(pAttributeValue);
}
else if (strcmp(pAttributeName, XML_3MF_ATTRIBUTE_TEXTURE2D_BOX) == 0) {
if (m_hasBox)
throw CNMRException(NMR_ERROR_DUPLICATE_BOX_ATTRIBUTE);
Expand Down
2 changes: 2 additions & 0 deletions Source/Model/Writer/v100/NMR_ModelWriterNode100_Model.cpp
Expand Up @@ -198,6 +198,8 @@ namespace NMR {
writeStringAttribute(XML_3MF_ATTRIBUTE_TEXTURE2D_TILESTYLEU, CModelTexture2DResource::tileStyleToString(pTexture2D->getTileStyleU()));
if (pTexture2D->getTileStyleV() != MODELTEXTURETILESTYLE_WRAP)
writeStringAttribute(XML_3MF_ATTRIBUTE_TEXTURE2D_TILESTYLEV, CModelTexture2DResource::tileStyleToString(pTexture2D->getTileStyleV()));
if (pTexture2D->getFilter() != MODELTEXTUREFILTER_AUTO)
writeStringAttribute(XML_3MF_ATTRIBUTE_TEXTURE2D_FILTER, CModelTexture2DResource::filterToString(pTexture2D->getFilter()));

if (pTexture2D->hasBox2D()) {
nfFloat fU, fV, fWidth, fHeight;
Expand Down

0 comments on commit ca53e4d

Please sign in to comment.