}
+class EntityFindSelected : public scene::Graph::Walker
+{
+public:
+ mutable const scene::Path *groupPath;
+ mutable scene::Instance *groupInstance;
+ EntityFindSelected(): groupPath(0), groupInstance(0)
+ {
+ }
+ bool pre(const scene::Path& path, scene::Instance& instance) const
+ {
+ return true;
+ }
+ void post(const scene::Path& path, scene::Instance& instance) const
+ {
+ Entity* entity = Node_getEntity(path.top());
+ if(entity != 0
+ && Instance_getSelectable(instance)->isSelected()
+ && node_is_group(path.top())
+ && !groupPath)
+ {
+ groupPath = &path;
+ groupInstance = &instance;
+ }
+ }
+};
+
+class EntityGroupSelected : public scene::Graph::Walker
+{
+ NodeSmartReference group;
+public:
+ EntityGroupSelected(const scene::Path &p): group(p.top().get())
+ {
+ }
+ bool pre(const scene::Path& path, scene::Instance& instance) const
+ {
+ return true;
+ }
+ void post(const scene::Path& path, scene::Instance& instance) const
+ {
+ if(Instance_getSelectable(instance)->isSelected())
+ {
+ Entity* entity = Node_getEntity(path.top());
+ if(entity == 0 && Node_isPrimitive(path.top()))
+ {
+ NodeSmartReference child(path.top().get());
+ NodeSmartReference parent(path.parent().get());
+
+ Node_getTraversable(parent)->erase(child);
+ Node_getTraversable(group)->insert(child);
+
+ if(Node_getTraversable(parent)->empty() && path.size() >= 3 && parent != Map_FindOrInsertWorldspawn(g_map))
+ {
+ NodeSmartReference parentparent(path[path.size() - 3].get());
+ Node_getTraversable(parentparent)->erase(parent);
+ }
+ }
+ }
+ }
+};
+
+void Entity_groupSelected()
+{
+ if (GlobalSelectionSystem().countSelected() < 1) return;
+
+ UndoableCommand undo("groupSelectedEntities");
+
+ scene::Path world_path(makeReference(GlobalSceneGraph().root()));
+ world_path.push(makeReference(Map_FindOrInsertWorldspawn(g_map)));
+
+ EntityFindSelected fse;
+ GlobalSceneGraph().traverse(fse);
+ if(fse.groupPath)
+ {
+ GlobalSceneGraph().traverse(EntityGroupSelected(*fse.groupPath));
+ }
+ else
+ {
+ GlobalSceneGraph().traverse(EntityGroupSelected(world_path));
+ }
+}
+
+
void Entity_connectSelected()
{
void Entity_constructMenu(GtkMenu* menu)
{
+ create_menu_item_with_mnemonic(menu, "_Regroup", "GroupSelection");
create_menu_item_with_mnemonic(menu, "_Ungroup", "UngroupSelection");
create_menu_item_with_mnemonic(menu, "_Connect", "ConnectSelection");
create_menu_item_with_mnemonic(menu, "_Select Color...", "EntityColor");
{
GlobalCommands_insert("EntityColor", FreeCaller<Entity_setColour>(), Accelerator('K'));
GlobalCommands_insert("ConnectSelection", FreeCaller<Entity_connectSelected>(), Accelerator('K', (GdkModifierType)GDK_CONTROL_MASK));
+ GlobalCommands_insert("GroupSelection", FreeCaller<Entity_groupSelected>());
GlobalCommands_insert("UngroupSelection", FreeCaller<Entity_ungroupSelected>());
GlobalPreferenceSystem().registerPreference("SI_Colors5", Vector3ImportStringCaller(g_entity_globals.color_entity), Vector3ExportStringCaller(g_entity_globals.color_entity));
{
vec3_t adjustment;
+ /* we have not parsed the brush completely yet... */
+ GetVectorForKey( ent, "origin", ent->origin );
+
VectorMA(origin, -1, ent->originbrush_origin, adjustment);
VectorAdd(adjustment, ent->origin, ent->origin);
VectorCopy(origin, ent->originbrush_origin);
char string[ 32 ];
vec3_t origin;
+ Sys_Printf( "Entity %i, Brush %i: origin brush detected\n",
+ mapEnt->mapEntityNum, entitySourceBrushes );
+
if( numEntities == 1 )
{
Sys_Printf( "Entity %i, Brush %i: origin brushes not allowed in world\n",
(used by func_group)
*/
+void AdjustBrushesForOrigin( entity_t *ent );
void MoveBrushesToWorld( entity_t *ent )
{
brush_t *b, *next;
parseMesh_t *pm;
+ /* we need to undo the common/origin adjustment, and instead shift them by the entity key origin */
+ VectorScale(ent->origin, -1, ent->originbrush_origin);
+ Sys_Printf("func_group: adjusting by %f %f %f\n", ent->originbrush_origin[0], ent->originbrush_origin[1], ent->originbrush_origin[2]);
+ AdjustBrushesForOrigin(ent);
+ VectorClear(ent->originbrush_origin);
/* move brushes */
for( b = ent->brushes; b != NULL; b = next )
brush_t *b;
parseMesh_t *p;
-
+ Sys_Printf("origin: adjusting by %f %f %f\n", ent->originbrush_origin[0], ent->originbrush_origin[1], ent->originbrush_origin[2]);
+
/* walk brush list */
for( b = ent->brushes; b != NULL; b = b->next )
{
s = &b->sides[ i ];
/* offset side plane */
- newdist = mapplanes[ s->planenum ].dist - DotProduct( mapplanes[ s->planenum ].normal, ent->origin );
+ newdist = mapplanes[ s->planenum ].dist - DotProduct( mapplanes[ s->planenum ].normal, ent->originbrush_origin );
/* find a new plane */
s->planenum = FindFloatPlane( mapplanes[ s->planenum ].normal, newdist, 0, NULL );
for( p = ent->patches; p != NULL; p = p->next )
{
for( i = 0; i < (p->mesh.width * p->mesh.height); i++ )
- VectorSubtract( p->mesh.verts[ i ].xyz, ent->origin, p->mesh.verts[ i ].xyz );
+ VectorSubtract( p->mesh.verts[ i ].xyz, ent->originbrush_origin, p->mesh.verts[ i ].xyz );
}
}
/* get entity origin and adjust brushes */
GetVectorForKey( mapEnt, "origin", mapEnt->origin );
- if( mapEnt->origin[ 0 ] || mapEnt->origin[ 1 ] || mapEnt->origin[ 2 ] )
+ if( mapEnt->originbrush_origin[ 0 ] || mapEnt->originbrush_origin[ 1 ] || mapEnt->originbrush_origin[ 2 ] )
AdjustBrushesForOrigin( mapEnt );
/* group_info entities are just for editor grouping (fixme: leak!) */