diff --git a/src/world/chunk.cc b/src/world/chunk.cc index 12a007b..1a60603 100644 --- a/src/world/chunk.cc +++ b/src/world/chunk.cc @@ -334,7 +334,7 @@ void chunk::objects_in_bbox (const vector3 & min, const vector3::const_iterator i; for (i = Objects.begin (); i != Objects.end(); i++) { - if (type & i->get_object()->type() && in_bbox (min, max, i->real_min(), i->real_max())) + if (type & i->get_object()->type() && in_bbox (min, max, i->solid_min(), i->solid_max())) { result.push_back ((chunk_info*) &(*i)); } diff --git a/src/world/chunk_info.h b/src/world/chunk_info.h index 34858bf..1afc569 100644 --- a/src/world/chunk_info.h +++ b/src/world/chunk_info.h @@ -53,6 +53,7 @@ namespace world chunk_info (entity *e, const vector3 & min, const vector3 & max) : Min (min), Max (max), Entity (e) { + calc_solid_max(); } /** @@ -62,6 +63,7 @@ namespace world chunk_info (const chunk_info & ci) : Min (ci.Min), Max (ci.Max), Entity (ci.Entity), Shadow (ci.Shadow) { + calc_solid_max(); } /** @@ -108,6 +110,26 @@ namespace world return Max + vector3(object->min_x(), object->min_y(), object->min_z()); } + /** + * Return "real" position, taking only solid placeable shape offset into account. + * @return lower coordinate of bounding box + */ + vector3 solid_min () const + { + const placeable *object = Entity->get_object(); + return Min + vector3(object->solid_min_x(), object->solid_min_y(), object->solid_min_z()); + } + + /** + * Return "real" position, taking only solid placeable shape offset into account. + * @return upper coordinate of bounding box + */ + vector3 solid_max () const + { + const placeable *object = Entity->get_object(); + return SolidMax + vector3(object->solid_min_x(), object->solid_min_y(), object->solid_min_z()); + } + /** * @name Object shadow * @@ -164,10 +186,23 @@ namespace world #endif private: + /** + * Calculate constant SolidMax + */ + void calc_solid_max() + { + const placeable *object = Entity->get_object(); + SolidMax = vector3(Min.x() + object->solid_max_length(), + Min.y() + object->solid_max_width(), + Min.z() + object->solid_max_height()); + } + /// pointer to map object entity * Entity; /// shadow cast on this object std::vector Shadow; + /// extend of the solid portion of the object + vector3 SolidMax; }; } diff --git a/src/world/placeable.h b/src/world/placeable.h index d09ab96..8b52269 100644 --- a/src/world/placeable.h +++ b/src/world/placeable.h @@ -149,84 +149,84 @@ namespace world * Get maximum placeable length. * @return max extension of placeable in x direction. */ - u_int16 max_length () const { return SolidMaxSize.x(); } + u_int16 max_length () const { return EntireMaxSize.x(); } /** * Get maximum placeable width. * @return max extension of placeable in y direction. */ - u_int16 max_width () const { return SolidMaxSize.y(); } + u_int16 max_width () const { return EntireMaxSize.y(); } /** * Get maximum placeable height. * @return max extension of placeable in z direction. */ - u_int16 max_height () const { return SolidMaxSize.z(); } + u_int16 max_height () const { return EntireMaxSize.z(); } - s_int16 min_x () const { return SolidMinPos.x(); } - s_int16 min_y () const { return SolidMinPos.y(); } - s_int16 min_z () const { return SolidMinPos.z(); } + s_int16 min_x () const { return EntireMinPos.x(); } + s_int16 min_y () const { return EntireMinPos.y(); } + s_int16 min_z () const { return EntireMinPos.z(); } /** * Get placeable's current length. * @return actual extension of placeable in x direction. */ - u_int16 length () const { return SolidCurSize.x(); } + u_int16 length () const { return EntireCurSize.x(); } /** * Get placeable's current width. * @return actual extension of placeable in y direction. */ - u_int16 width () const { return SolidCurSize.y(); } + u_int16 width () const { return EntireCurSize.y(); } /** * Get placeable's current height. * @return actual extension of placeable in z direction. */ - u_int16 height () const { return SolidCurSize.z(); } + u_int16 height () const { return EntireCurSize.z(); } //@} - s_int16 cur_x () const { return SolidCurPos.x(); } - s_int16 cur_y () const { return SolidCurPos.y(); } - s_int16 cur_z () const { return SolidCurPos.z(); } + s_int16 cur_x () const { return EntireCurPos.x(); } + s_int16 cur_y () const { return EntireCurPos.y(); } + s_int16 cur_z () const { return EntireCurPos.z(); } /** - * Get maximum placeable length accounting for both solid and non-solid shapes. + * Get maximum placeable length only accounting for solid shapes. * @return max extension of placeable in x direction. */ - u_int16 entire_max_length () const { return EntireMaxSize.x(); } + u_int16 solid_max_length () const { return SolidMaxSize.x(); } /** - * Get maximum placeable width accounting for both solid and non-solid shapes. + * Get maximum placeable width only accounting for solid shapes. * @return max extension of placeable in y direction. */ - u_int16 entire_max_width () const { return EntireMaxSize.y(); } + u_int16 solid_max_width () const { return SolidMaxSize.y(); } /** - * Get maximum placeable height accounting for both solid and non-solid shapes. + * Get maximum placeable height only accounting for solid shapes. * @return max extension of placeable in z direction. */ - u_int16 entire_max_height () const { return EntireMaxSize.z(); } + u_int16 solid_max_height () const { return SolidMaxSize.z(); } - s_int16 entire_min_x () const { return EntireMinPos.x(); } - s_int16 entire_min_y () const { return EntireMinPos.y(); } - s_int16 entire_min_z () const { return EntireMinPos.z(); } + s_int16 solid_min_x () const { return SolidMinPos.x(); } + s_int16 solid_min_y () const { return SolidMinPos.y(); } + s_int16 solid_min_z () const { return SolidMinPos.z(); } /** - * Get placeable's current length accounting for both solid and non-solid shapes. + * Get placeable's current length only accounting for solid shapes * @return actual extension of placeable in x direction. */ - u_int16 entire_length () const { return EntireCurSize.x(); } + u_int16 solid_length () const { return SolidCurSize.x(); } /** - * Get placeable's current width accounting for both solid and non-solid shapes. + * Get placeable's current width only accounting for solid shapes * @return actual extension of placeable in y direction. */ - u_int16 entire_width () const { return EntireCurSize.y(); } + u_int16 solid_width () const { return SolidCurSize.y(); } /** - * Get placeable's current height accounting for both solid and non-solid shapes. + * Get placeable's current height only accounting for solid shapes * @return actual extension of placeable in z direction. */ - u_int16 entire_height () const { return EntireCurSize.z(); } + u_int16 solid_height () const { return SolidCurSize.z(); } //@} - s_int16 entire_cur_x () const { return EntireCurPos.x(); } - s_int16 entire_cur_y () const { return EntireCurPos.y(); } - s_int16 entire_cur_z () const { return EntireCurPos.z(); } + s_int16 solid_cur_x () const { return SolidCurPos.x(); } + s_int16 solid_cur_y () const { return SolidCurPos.y(); } + s_int16 solid_cur_z () const { return SolidCurPos.z(); } /** * Get placeable's map