struct EdEntMesh : EDGUILayoutRow { FINLINE void Acquire(){ ++m_refcount; } FINLINE void Release(){ --m_refcount; if( m_refcount <= 0 ) delete this; } int32_t m_refcount; EdEntMesh() : m_refcount( 0 ), m_group( true, "Mesh properties" ), m_ctlPos( V3(0), 2, V3(-8192), V3(8192) ), m_ctlAngles( V3(0), 2, V3(0), V3(360) ), m_ctlScaleUni( 1, 2, 0.01f, 100.0f ), m_ctlScaleSep( V3(1), 2, V3(0.01f), V3(100.0f) ) { tyname = "mesh"; m_group.caption = "Mesh properties"; m_ctlPos.caption = "Position"; m_ctlAngles.caption = "Rotation"; m_ctlScaleUni.caption = "Scale (uniform)"; m_ctlScaleSep.caption = "Scale (separate)"; m_group.Add( &m_ctlPos ); m_group.Add( &m_ctlAngles ); m_group.Add( &m_ctlScaleUni ); m_group.Add( &m_ctlScaleSep ); Add( &m_group ); } const Vec3& Pos() const { return m_ctlPos.m_value; } const Vec3& RotAngles() const { return m_ctlAngles.m_value; } float ScaleUni() const { return m_ctlScaleUni.m_value; } const Vec3& ScaleSep() const { return m_ctlScaleSep.m_value; } void SetPosition( const Vec3& pos ){ m_ctlPos.SetValue( pos ); } EdEntMesh& operator = ( const EdEntMesh& o ) { m_ctlPos.SetValue( o.Pos() ); m_ctlAngles.SetValue( o.RotAngles() ); m_ctlScaleUni.SetValue( o.ScaleUni() ); m_ctlScaleSep.SetValue( o.ScaleSep() ); return *this; } virtual int OnEvent( EDGUIEvent* e ) { switch( e->type ) { case EDGUI_EVENT_PROPEDIT: RegenerateMesh(); break; } return EDGUILayoutRow::OnEvent( e ); } void RegenerateMesh() { if( !cached_mesh ) cached_mesh = GR_GetMesh( "meshes/test_table.ssm" ); if( !cached_meshinst ) { cached_meshinst = g_EdScene->CreateMeshInstance(); cached_meshinst->mesh = cached_mesh; cached_meshinst->textures[ 0 ] = GR_GetTexture( "textures/metal0.png" ); } cached_meshinst->matrix = Mat4::CreateSRT( m_ctlScaleSep.m_value * m_ctlScaleUni.m_value, DEG2RAD( m_ctlAngles.m_value ), m_ctlPos.m_value ); } bool RayIntersect( const Vec3& rpos, const Vec3& rdir, float outdst[1] ) { return RaySphereIntersect( rpos, rdir, m_ctlPos.m_value, 1, outdst ); } EDGUIGroup m_group; EDGUIPropVec3 m_ctlPos; EDGUIPropVec3 m_ctlAngles; EDGUIPropFloat m_ctlScaleUni; EDGUIPropVec3 m_ctlScaleSep; MeshHandle cached_mesh; MeshInstHandle cached_meshinst; }; typedef Handle< EdEntMesh > EdEntMeshHandle;