Make NULL models rendered as a box, and selectable (were already editable)

TODO:
- Handle the case "Model not found".
- Add relevant console prints.
- Fix glitchy-looking selected box.
This commit is contained in:
Mateos81 2015-11-11 11:56:29 +01:00
parent 6a5fca6f1c
commit 3027776243
7 changed files with 27 additions and 3 deletions

View File

@ -77,6 +77,7 @@ virtual ~IRender() { }
virtual void IncRef() = 0; // increments the reference counter for this object virtual void IncRef() = 0; // increments the reference counter for this object
virtual void DecRef() = 0; // decrements the reference counter for this object, deletes the object if reference count is zero virtual void DecRef() = 0; // decrements the reference counter for this object, deletes the object if reference count is zero
virtual void Draw( int state, int rflags ) const = 0; // render the object - state = the opengl state virtual void Draw( int state, int rflags ) const = 0; // render the object - state = the opengl state
virtual const bool IsModelNotNull() const = 0;
virtual const aabb_t *GetAABB() const = 0; virtual const aabb_t *GetAABB() const = 0;
}; };

View File

@ -40,6 +40,7 @@ void DecRef() {
// IRender // IRender
void Draw( int state, int rflags ) const; void Draw( int state, int rflags ) const;
const bool IsModelNotNull() const { return m_model && m_model->pRender; }
const aabb_t *GetAABB() const { return &m_BBox; } const aabb_t *GetAABB() const { return &m_BBox; }
// ISelect // ISelect
@ -105,6 +106,7 @@ void DecRef() {
// IRender // IRender
void Draw( int state, int rflags ) const; void Draw( int state, int rflags ) const;
const bool IsModelNotNull() const { return m_model && m_model->pRender; }
const aabb_t *GetAABB() const { return &m_BBox; } const aabb_t *GetAABB() const { return &m_BBox; }
// ISelect // ISelect

View File

@ -66,6 +66,7 @@ void Reload( void );
void Draw( int state, vector<IShader*> shaders, int rflags ) const; void Draw( int state, vector<IShader*> shaders, int rflags ) const;
//IRender //IRender
virtual void Draw( int state, int rflags ) const; virtual void Draw( int state, int rflags ) const;
virtual const bool IsModelNotNull() const { return true; }
virtual const aabb_t *GetAABB() const { return &m_BBox; } virtual const aabb_t *GetAABB() const { return &m_BBox; }
//ISelect //ISelect

View File

@ -141,6 +141,9 @@ virtual void DecRef(){
virtual void Draw( int state, int rflags ) const { virtual void Draw( int state, int rflags ) const {
m_model->Draw( state, m_shaders, rflags ); m_model->Draw( state, m_shaders, rflags );
} }
virtual const bool IsModelNotNull() const {
return m_model != NULL;
}
virtual const aabb_t *GetAABB() const { virtual const aabb_t *GetAABB() const {
return m_model->GetAABB(); return m_model->GetAABB();
} }
@ -300,6 +303,9 @@ virtual void DecRef(){
virtual void Draw( int state, int rflags ) const { virtual void Draw( int state, int rflags ) const {
m_model->Draw( state, rflags ); m_model->Draw( state, rflags );
} }
virtual const bool IsModelNotNull() const {
return m_model != NULL;
}
virtual const aabb_t *GetAABB() const { virtual const aabb_t *GetAABB() const {
return m_model->GetAABB(); return m_model->GetAABB();
} }

View File

@ -45,6 +45,7 @@ void DecRef() {
//IRender //IRender
void Draw( int state, int rflags ) const; void Draw( int state, int rflags ) const;
const bool IsModelNotNull() const { return true; }
const aabb_t *GetAABB() const { return &m_BBox; } const aabb_t *GetAABB() const { return &m_BBox; }
//ISelect //ISelect

View File

@ -2223,7 +2223,8 @@ face_t *Brush_Ray( vec3_t origin, vec3_t dir, brush_t *b, float *dist, int nFlag
if ( b->owner->eclass->fixedsize if ( b->owner->eclass->fixedsize
&& b->owner->model.pSelect && b->owner->model.pSelect
&& !( !IsBrushSelected( b ) && ( g_PrefsDlg.m_nEntityShowState & ENTITY_SELECTED_ONLY ) ) && !( !IsBrushSelected( b ) && ( g_PrefsDlg.m_nEntityShowState & ENTITY_SELECTED_ONLY ) )
&& g_PrefsDlg.m_nEntityShowState != ENTITY_BOX ) { && g_PrefsDlg.m_nEntityShowState != ENTITY_BOX
&& b->owner->model.pRender->IsModelNotNull()) {
ray_t ray_local; ray_t ray_local;
vec_t dist_local = FLT_MAX; vec_t dist_local = FLT_MAX;
ray_construct_for_vec3( &ray_local, origin, dir ); ray_construct_for_vec3( &ray_local, origin, dir );

View File

@ -922,12 +922,24 @@ void CamWnd::Cam_DrawBrush( brush_t *b, int mode ){
if ( !( nGLState & DRAW_GL_TEXTURE_2D ) ) { if ( !( nGLState & DRAW_GL_TEXTURE_2D ) ) {
qglColor4fv( material ); qglColor4fv( material );
} }
else{ qglColor4fv( identity ); } else {
qglColor4fv( identity );
}
if ( nGLState & DRAW_GL_LIGHTING ) { if ( nGLState & DRAW_GL_LIGHTING ) {
qglShadeModel( GL_SMOOTH ); qglShadeModel( GL_SMOOTH );
} }
b->owner->model.pRender->Draw( nGLState, DRAW_RF_CAM ); // Check model validity
// If the model is NULL or invalid, draw a box instead
bool temp = b->owner->model.pRender->IsModelNotNull();
if ( temp ) {
b->owner->model.pRender->Draw(nGLState, DRAW_RF_CAM);
}
else {
qglColor4fv( material );
aabb_draw( b->owner->model.pRender->GetAABB(), DRAW_GL_WIRE );
}
} }
break; break;
case DRAW_WIRE: case DRAW_WIRE: