/*------------------------------------------------------------------*/ void AzTrTreeFeat::updateMatrix(const AzDataForTrTree *data, const AzTrTreeEnsemble_ReadOnly *ens, AzBmat *b_tran) /* inout */ const { if (data == NULL) return; const char *eyec = "AzTrTreeFeat::updateMatrix"; int f_num = featNum(); if (ens->size() != treeNum()) { throw new AzException(eyec, "size of tree ensemble and #feat should be the same"); } int old_f_num = b_tran->colNum(); if (old_f_num > f_num) { throw new AzException(eyec, "#col is bigger than #feat"); } int fx; for (fx = 0; fx < old_f_num; ++fx) { if (f_inf.point(fx)->isRemoved) { b_tran->clear(fx); } } if (old_f_num == f_num) { if (old_f_num == 0) { /* for the rare case that no feature was generated */ b_tran->reform(data->dataNum(), f_num); /* added 9/13/2011 */ } return; } _updateMatrix(data, ens, old_f_num, b_tran); }
void MyCEGUIGeometryBuffer::draw() const { u32 qcnt = m_Quads.size(); if (!qcnt) return; if (!m_ClipRect.isValid()) return; if (!m_MatrixValid) _updateMatrix(); core::vector3df ul(0.0f, 0.0f, 0.0f); core::vector3df lr(0.0f, 0.0f, 0.0f); core::rectf clipped_rect_draw; core::rectf clipped_rect_tc; for (u32 i = 0; i < qcnt; i++) { RenderQuad &quad = m_Quads[i]; ul.X = quad.rect_draw.UpperLeftCorner.X; ul.Y = quad.rect_draw.UpperLeftCorner.Y; lr.X = quad.rect_draw.LowerRightCorner.X; lr.Y = quad.rect_draw.LowerRightCorner.Y; m_Matrix.transformVect(ul); m_Matrix.transformVect(lr); clipped_rect_draw.set(ul.X, ul.Y, lr.X, lr.Y); clipped_rect_draw.clipAgainst(m_ClipRect); if (!clipped_rect_draw.isValid()) continue; f32 rd_w = quad.rect_draw.getWidth(); f32 rd_h = quad.rect_draw.getHeight(); f32 rtc_w = quad.rect_tc.getWidth(); f32 rtc_h = quad.rect_tc.getHeight(); f32 clip_ul_x = (clipped_rect_draw.UpperLeftCorner.X - ul.X) / rd_w; f32 clip_ul_y = (clipped_rect_draw.UpperLeftCorner.Y - ul.Y) / rd_h; f32 clip_lr_x = (clipped_rect_draw.LowerRightCorner.X - lr.X) / rd_w; f32 clip_lr_y = (clipped_rect_draw.LowerRightCorner.Y - lr.Y) / rd_h; clipped_rect_tc.set( quad.rect_tc.UpperLeftCorner.X + clip_ul_x * rtc_w, quad.rect_tc.UpperLeftCorner.Y + clip_ul_y * rtc_h, quad.rect_tc.LowerRightCorner.X + clip_lr_x * rtc_w, quad.rect_tc.LowerRightCorner.Y + clip_lr_y * rtc_h); m_Driver.registerGUIImageForRendering( quad.texture, s_NextZ, clipped_rect_draw, clipped_rect_tc, quad.colors[0], quad.colors[1], quad.colors[2], quad.colors[3], quad.useAlphaBlending); } s_NextZ -= 0.000001f; }
//---------------------------------------------------------------------- // //---------------------------------------------------------------------- void Camera::convertWorldPosToScreenPos( LVector3* out, const LVector3& world_pos, const LVector2& view_size ) const { _updateMatrix(); *out = LVector3::TransformCoord(world_pos, mViewProjMatrix); out->Y *= -1.0f; // y は下が + なので上下反転 out->X = ( out->X + 1.0f ) * 0.5f; // 0.0~2.0 にしたあと、0.0~1.0 にする out->Y = ( out->Y + 1.0f ) * 0.5f; // (左上を原点にしたあと、) out->X *= view_size.X; out->Y *= view_size.Y; }
void CObject::Cull() { if (!m_model) _loadModel(); if (m_updateMatrix) _updateMatrix(); byte outside[8]; memset(outside, 0, sizeof(outside)); int plane; for (int point = 0; point < 8; point++) { for (plane = 0; plane < 6; plane++) { if (g_planeFrustum[plane].a * m_bounds[point].x + g_planeFrustum[plane].b * m_bounds[point].y + g_planeFrustum[plane].c * m_bounds[point].z + g_planeFrustum[plane].d < 0) { outside[point] |= (1 << plane); } } if (outside[point] == 0) { m_visible = true; return; } } if ((outside[0] & outside[1] & outside[2] & outside[3] & outside[4] & outside[5] & outside[6] & outside[7]) != 0) { m_visible = false; return; } m_visible = true; }