BlenderConnection tweaks

This commit is contained in:
Jack Andersen 2016-10-02 12:34:10 -10:00
parent 4f53d886ce
commit e65fe14c53
6 changed files with 69 additions and 8 deletions

View File

@ -1,4 +1,4 @@
import bpy
import bpy, struct
from mathutils import Vector
def build_dock_connections():
@ -44,9 +44,9 @@ def cook(writebuf):
writebuf(struct.pack('I', len(obj.name)))
writebuf(obj.name.encode())
pt = Vector(copy_obj.bound_box[0])
pt = Vector(obj.bound_box[0])
writebuf(struct.pack('fff', pt[0], pt[1], pt[2]))
pt = Vector(copy_obj.bound_box[6])
pt = Vector(obj.bound_box[6])
writebuf(struct.pack('fff', pt[0], pt[1], pt[2]))
wmtx = obj.matrix_world
@ -67,7 +67,8 @@ def cook(writebuf):
v = wmtx * ch.data.vertices[vi].co
writebuf(struct.pack('fff', v[0], v[1], v[2]))
conn_dock = dock_conns[ch.name]
writebuf(struct.pack('II', conn_dock[0], conn_dock[1]))
writebuf(struct.pack('I', conn_dock[0]))
writebuf(struct.pack('I', conn_dock[1]))
# Panel draw

View File

@ -291,6 +291,21 @@ def dataout_loop():
writepipebuf(struct.pack('IIfffffb', layer, type, obj.data.energy, spotCutoff, constant, linear, quadratic,
castShadow))
elif cmdargs[0] == 'GETTEXTURES':
writepipeline(b'OK')
img_count = 0
for img in bpy.data.images:
if img.type == 'IMAGE':
img_count += 1
writepipebuf(struct.pack('I', img_count))
for img in bpy.data.images:
if img.type == 'IMAGE':
path = os.path.normpath(bpy.path.abspath(img.filepath))
writepipebuf(struct.pack('I', len(path)))
writepipebuf(path.encode())
elif cmdargs[0] == 'ACTORCOMPILE':
writepipeline(b'OK')
hecl.sact.cook(writepipebuf)

2
hecl/extern/athena vendored

@ -1 +1 @@
Subproject commit d3d63082d0087e2f85ee3bd43d27f077f40f6ebf
Subproject commit b3ca9a0a9023580db5dff68158606a64841b7f4e

View File

@ -658,6 +658,9 @@ public:
/** Gather all lights in scene (AREA blends only) */
std::vector<Light> compileLights();
/** Gather all texture paths in scene */
std::vector<ProjectPath> getTextures();
/** Intermediate actor representation prepared by blender from a single HECL actor blend */
struct Actor
{

View File

@ -132,9 +132,6 @@ public:
virtual bool canPackage(const PackagePassInfo& info,
SystemString& reasonNo)
{(void)info;reasonNo=_S("not implemented");return false;}
virtual void gatherDependencies(const PackagePassInfo& info,
std::unordered_set<ProjectPath>& implicitsOut)
{(void)info;(void)implicitsOut;}
virtual void doPackage(const PackagePassInfo& info)
{(void)info;}
@ -273,6 +270,7 @@ private:
ProjectPath m_dotPath;
ProjectPath m_cookedRoot;
std::vector<ProjectDataSpec> m_compiledSpecs;
std::unordered_map<uint64_t, ProjectPath> m_bridgePathCache;
bool m_valid = false;
public:
Project(const hecl::ProjectRootPath& rootPath);
@ -455,6 +453,21 @@ public:
*/
PackageDepsgraph buildPackageDepsgraph(const ProjectPath& path);
/** Add ProjectPath to bridge cache */
void addBridgePathToCache(uint64_t id, const ProjectPath& path) { m_bridgePathCache[id] = path; }
/** Clear all ProjectPaths in bridge cache */
void clearBridgePathCache() { m_bridgePathCache.clear(); }
/** Lookup ProjectPath from bridge cache */
const ProjectPath* lookupBridgePath(uint64_t id) const
{
auto search = m_bridgePathCache.find(id);
if (search == m_bridgePathCache.cend())
return nullptr;
return &search->second;
}
};
}

View File

@ -1332,6 +1332,35 @@ std::vector<BlenderConnection::DataStream::Light> BlenderConnection::DataStream:
return ret;
}
std::vector<ProjectPath> BlenderConnection::DataStream::getTextures()
{
m_parent->_writeLine("GETTEXTURES");
char readBuf[256];
m_parent->_readLine(readBuf, 256);
if (strcmp(readBuf, "OK"))
BlenderLog.report(logvisor::Fatal, "unable to get textures: %s", readBuf);
uint32_t texCount;
m_parent->_readBuf(&texCount, 4);
std::vector<ProjectPath> texs;
texs.reserve(texCount);
for (uint32_t i=0 ; i<texCount ; ++i)
{
uint32_t bufSz;
m_parent->_readBuf(&bufSz, 4);
std::string readStr(bufSz, ' ');
m_parent->_readBuf(&readStr[0], bufSz);
SystemStringView absolute(readStr);
SystemString relative =
m_parent->m_loadedBlend.getProject().getProjectRootPath().getProjectRelativeFromAbsolute(absolute);
texs.emplace_back(m_parent->m_loadedBlend.getProject().getProjectWorkingPath(), relative);
}
return texs;
}
BlenderConnection::DataStream::Actor BlenderConnection::DataStream::compileActor()
{
if (m_parent->m_loadedType != BlendType::Actor)