|
|
|
/* This file is part of Korman.
|
|
|
|
*
|
|
|
|
* Korman is free software: you can redistribute it and/or modify
|
|
|
|
* it under the terms of the GNU General Public License as published by
|
|
|
|
* the Free Software Foundation, either version 3 of the License, or
|
|
|
|
* (at your option) any later version.
|
|
|
|
*
|
|
|
|
* Korman 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 Korman. If not, see <http://www.gnu.org/licenses/>.
|
|
|
|
*/
|
|
|
|
|
|
|
|
#ifndef _KORLIB_H
|
|
|
|
#define _KORLIB_H
|
|
|
|
|
|
|
|
#define NOMINMAX
|
|
|
|
|
|
|
|
#include <cstdint>
|
|
|
|
#include <Python.h>
|
|
|
|
#include <utility>
|
|
|
|
|
|
|
|
#define _pycs(x) const_cast<char*>(x)
|
Refactor image data handling for cube maps
Previously, we allowed OpenGL to generate all of the mip levels for us
in a mipmap. This was pretty doggone fast and worked reasonably well.
However, with cube maps, we will need to use images that are not always
backed in Blender... this is because Blender stores cube maps as one
single image instead of one image per face. So, we need to be able to
generate those mip levels, preferably without touching Blender's
`Image.pixels`, which is slower than Christmas...
Also of note... `Image.gl_load()` will actually scale the iamge to a POT
when Blender is using OpenGL ES... but not on other platforms. So, now,
we just ask Blender to load the image and deal with the POT-izing later.
The con here is that the pure python implementation of the image scaling
function is SLOOOOOOOW. We're talking ~40 seconds to process a 1024x1024
mipmap. No one should be using the reference implementation, however,
and the C++ implementation shows no noticable slowdown over the OpenGL
code.
Whew.
6 years ago
|
|
|
#define arrsize(a) (sizeof(a) / sizeof((a)[0]))
|
|
|
|
|
|
|
|
class PyObjectRef {
|
|
|
|
PyObject* m_object;
|
|
|
|
|
|
|
|
public:
|
|
|
|
PyObjectRef() : m_object() { }
|
|
|
|
PyObjectRef(PyObject* o) : m_object(o) { }
|
|
|
|
PyObjectRef(const PyObjectRef& copy) = delete;
|
|
|
|
PyObjectRef(PyObjectRef&& move) {
|
|
|
|
m_object = move.m_object;
|
|
|
|
move.m_object = NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
~PyObjectRef() { Py_XDECREF(m_object); }
|
|
|
|
|
|
|
|
operator PyObject*() const { return m_object; }
|
|
|
|
|
|
|
|
PyObjectRef& operator =(PyObject* rhs) {
|
|
|
|
Py_XDECREF(m_object);
|
|
|
|
m_object = rhs;
|
|
|
|
return *this;
|
|
|
|
}
|
|
|
|
|
|
|
|
PyObjectRef& operator =(PyObjectRef&& move) {
|
|
|
|
m_object = move.m_object;
|
|
|
|
move.m_object = NULL;
|
|
|
|
return *this;
|
|
|
|
}
|
|
|
|
|
|
|
|
PyObjectRef& operator =(const PyObjectRef& copy) = delete;
|
|
|
|
};
|
|
|
|
|
|
|
|
#endif // _KORLIB_H
|