rSize ruiAbsoluteLayout::Layout(rRect& rect){
	if (m_layoutItems.size() == 0) return rSize(0, 0);

	rPoint ptmin(INT32_MAX, INT32_MAX);
	rPoint ptmax(INT32_MIN, INT32_MIN);

	for (size_t i = 0; i < m_layoutItems.size(); i++){	
		ruiWidget* widget = m_layoutItems[i];
		int margins[4] = { 0, 0, 0, 0 };

		int top = 0;
		int left = 0;
		int bottom = 0;
		int right = 0;

		ruiStyle* properties = widget->ComputedStyle();

		bool hasTop = properties->GetInt("top", top);
		bool hasLeft = properties->GetInt("left", left);
		bool hasBottom = properties->GetInt("bottom", bottom);
		bool hasRight = properties->GetInt("right", right);

		rSize itemSize = widget->Size();
		
		rPoint position;

		if (hasTop)
			position.y = top;

		else if (hasBottom)
			position.y = rect.Bottom() - bottom - itemSize.y;
		else
			position.y = 0;
			

		if (hasLeft)
			position.x = left;
		else if (hasRight)
			position.x = rect.Right() - right - itemSize.x;
		else
			position.x = 0;
			
		widget->SetPosition(position);

		UpdatePoints(ptmin, ptmax, position);
		UpdatePoints(ptmin, ptmax, rPoint(position.x + itemSize.x, position.y + itemSize.y));
	}

	rPoint difference = ptmax - ptmin;
	return rSize(difference.x, difference.y);
}
Example #2
0
bool RateLimiter::OpenElement(rapidxml::xml_node<>* elementNode)
{
    if(!OpenCADProperties(elementNode)) return false;
    if(!OpenControlNodes(elementNode)) return false;

    // Element properties
    m_upLimit = XMLParser::GetNodeValueDouble(elementNode, "UpperLimit");
    m_lowLimit = XMLParser::GetNodeValueDouble(elementNode, "LowerLimit");

    StartMove(m_position);
    UpdatePoints();
    return true;
}
Example #3
0
bool Exponential::OpenElement(rapidxml::xml_node<>* elementNode)
{
    if(!OpenCADProperties(elementNode)) return false;
    if(!OpenControlNodes(elementNode)) return false;

    // Element properties
    auto value = elementNode->first_node("Value");
    m_aValue = XMLParser::GetNodeValueDouble(value, "A");
    m_bValue = XMLParser::GetNodeValueDouble(value, "B");

    StartMove(m_position);
    UpdatePoints();
    return true;
}
Example #4
0
void Constant::SetValue(double value)
{
    m_value = value;
    wxString text = StringFromDouble(m_value);

    if(m_glText)
        m_glText->SetText(text);
    else
        m_glText = new OpenGLText(text);

    m_width = m_glText->GetWidth() + 6 + 2 * m_borderSize;
    m_height = m_glText->GetHeight() + 6 + 2 * m_borderSize;

    UpdatePoints();
}
Example #5
0
/*
==================
void Actor::Initalize(const char* GPSData, double OriginLatitude, double OriginLongitude)
==================
*/
void Actor::Initalize(const char* GPSData, double OriginLatitude, double OriginLongitude) {
	gpsData.Import(GPSData);
	UpdatePoints(OriginLatitude, OriginLongitude);
	renderObject = new Cube();

	renderObject->SetRealPosition(loggedPoints.front());
	((Cube*)renderObject)->Scale(glm::vec3(0.5f, 0.5f, 0.5f));
	//renderObject->Translate(glm::vec3(2, 2, 2));

	printf("GPS -> Realspace Conversion\n");
	printf("----------------------\n");
	for (unsigned int i = 0; i < loggedPoints.size(); i++) {
		printf("X: %f | Y: %f | Z: %f\n", loggedPoints[i].x, loggedPoints[i].y, loggedPoints[i].z);
	}
	printf("----------------------\n\n");

}
Example #6
0
void RateLimiter::Rotate(bool clockwise)
{
    if(clockwise)
        m_angle += 90.0;
    else
        m_angle -= 90.0;
    if(m_angle >= 360.0)
        m_angle = 0.0;
    else if(m_angle < 0)
        m_angle = 270.0;

    UpdatePoints();

    for(auto it = m_nodeList.begin(), itEnd = m_nodeList.end(); it != itEnd; ++it) {
        Node* node = *it;
        node->Rotate(clockwise);
    }
}
void ACollectable::OnBeginOverlap(AActor* actor, UPrimitiveComponent* actorComponent, int32 actorBodyIndex, bool bFromSweep, const FHitResult & SweepResult)
{
	GEngine->AddOnScreenDebugMessage(-1, 2.0f, FColor::Red, TEXT("BeginOverlap"));
	if (Role == ROLE_Authority) { UpdatePoints(Cast<ACharacter>(actor), 5); Destroy(); }
}
Example #8
0
/**
 * @brief Create help create tool.
 * @param _id tool id, 0 if tool doesn't exist yet.
 * @param d1 first detail.
 * @param d2 second detail.
 * @param d1id id first detail.
 * @param d2id id second detail.
 * @param indexD1 index edge in first detail.
 * @param indexD2 index edge in second detail.
 * @param scene pointer to scene.
 * @param doc dom document container.
 * @param data container with variables.
 * @param parse parser file mode.
 * @param typeCreation way we create this tool.
 */
VToolUnionDetails* VToolUnionDetails::Create(const quint32 _id, const VDetail &d1, const VDetail &d2,
                                             const quint32 &d1id, const quint32 &d2id, const quint32 &indexD1,
                                             const quint32 &indexD2, VMainGraphicsScene *scene, VPattern *doc,
                                             VContainer *data, const Document &parse, const Source &typeCreation)
{
    VToolUnionDetails *unionDetails = 0;
    quint32 id = _id;
    if (typeCreation == Source::FromGui)
    {
        id = data->getNextId();
    }
    else
    {
        if (parse != Document::FullParse)
        {
            doc->UpdateToolData(id, data);
        }
    }
    VAbstractTool::AddRecord(id, Tool::UnionDetails, doc);
    if (parse == Document::FullParse)
    {
        //Scene doesn't show this tool, so doc will destroy this object.
        unionDetails = new VToolUnionDetails(doc, data, id, d1, d2, indexD1, indexD2, typeCreation, doc);
        QHash<quint32, VDataTool*>* tools = doc->getTools();
        tools->insert(id, unionDetails);
        for (int i = 0; i < d1.CountNode(); ++i)
        {
            doc->IncrementReferens(d1.at(i).getId());
        }
        for (int i = 0; i < d2.CountNode(); ++i)
        {
            doc->IncrementReferens(d2.at(i).getId());
        }

    }
    VNodeDetail det1p1;
    VNodeDetail det1p2;
    d1.NodeOnEdge(indexD1, det1p1, det1p2);
    Q_UNUSED(det1p2);

    VPointF point1;
    VPointF point2;
    PointsOnEdge(d1, indexD1, point1, point2, data);

    VPointF point3;
    VPointF point4;
    PointsOnEdge(d2, indexD2, point3, point4, data);

    const qreal dx = point1.x() - point4.x();
    const qreal dy = point1.y() - point4.y();

    point3.setX(point3.x()+dx);
    point3.setY(point3.y()+dy);

    point4.setX(point4.x()+dx);
    point4.setY(point4.y()+dy);

    const qreal angle = QLineF(point4.toQPointF(), point3.toQPointF()).angleTo(QLineF(point1.toQPointF(),
                                                                                      point2.toQPointF()));
    qint32 pointsD2 = 0; //Keeps count points second detail, what we already add.

    if (typeCreation == Source::FromGui)
    {
        qint32 j = 0, i = 0;
        VDetail newDetail;
        do
        {
            AddToNewDetail(unionDetails, doc, data, newDetail, d1.RemoveEdge(indexD1), i, id);
            ++i;
            if (i > d1.indexOfNode(det1p1.getId()) && pointsD2 < d2.RemoveEdge(indexD2).CountNode()-2)
            {
                do
                {
                    FindJ(pointsD2, d2, indexD2, j);
                    if (pointsD2 == d2.RemoveEdge(indexD2).CountNode() -2)
                    {
                        break;
                    }
                    if (j >= d2.RemoveEdge(indexD2).CountNode())
                    {
                        j=0;
                    }
                    AddToNewDetail(unionDetails, doc, data, newDetail, d2.RemoveEdge(indexD2), j, id, dx, dy,
                                   det1p1.getId(), angle);
                    ++pointsD2;
                    ++j;
                } while (pointsD2 < d2.RemoveEdge(indexD2).CountNode());
            }
        } while (i < d1.RemoveEdge(indexD1).CountNode());

        newDetail.setName("Detail");
        newDetail.setWidth(d1.getWidth());
        VToolDetail::Create(0, newDetail, scene, doc, data, parse, Source::FromTool);
        QHash<quint32, VDataTool*>* tools = doc->getTools();
        SCASSERT(tools != nullptr);

        {
            VToolDetail *toolDet = qobject_cast<VToolDetail*>(tools->value(d1id));
            SCASSERT(toolDet != nullptr);
            bool ask = false;
            toolDet->Remove(ask);
        }

        VToolDetail *toolDet = qobject_cast<VToolDetail*>(tools->value(d2id));
        SCASSERT(toolDet != nullptr);
        bool ask = false;
        toolDet->Remove(ask);
    }
    else
    {
        quint32 idCount = 0;
        qint32 j = 0, i = 0;
        do
        {
            UpdatePoints(id, data, d1.RemoveEdge(indexD1), i, idCount);
            ++i;
            if (i > d1.indexOfNode(det1p1.getId()) && pointsD2 < d2.RemoveEdge(indexD2).CountNode()-2)
            {
                do
                {
                    FindJ(pointsD2, d2, indexD2, j);
                    if (pointsD2 == d2.RemoveEdge(indexD2).CountNode()-2)
                    {
                        break;
                    }
                    if (j >= d2.RemoveEdge(indexD2).CountNode())
                    {
                        j=0;
                    }
                    UpdatePoints(id, data, d2.RemoveEdge(indexD2), j, idCount, dx, dy, det1p1.getId(), angle);
                    ++pointsD2;
                    ++j;
                } while (pointsD2 < d2.RemoveEdge(indexD2).CountNode());
            }
        } while (i<d1.RemoveEdge(indexD1).CountNode());
    }
    return nullptr;
}
void
SubdivUserData::Populate(MObject mesh)
{
    MStatus s;
    MFnMesh meshFn(mesh);
    MIntArray vertexCount, vertexList;
    meshFn.getVertices(vertexCount, vertexList);
    MUintArray edgeIds;
    MDoubleArray edgeCreaseData;
    meshFn.getCreaseEdges(edgeIds, edgeCreaseData);
    MUintArray vtxIds;
    MDoubleArray vtxCreaseData;
    meshFn.getCreaseVertices(vtxIds, vtxCreaseData );

    short level = 1;
    FindAttribute(meshFn, "smoothLevel", &level);
    if(level < 1) level = 1;

    short interpBoundary = 0;
    FindAttribute(meshFn, "boundaryRule", &interpBoundary);

    if(CompareArray(_vertexList, vertexList) &&
       CompareArray(_edgeIds, edgeIds) &&
       CompareArray(_edgeCreaseData, edgeCreaseData) &&
       CompareArray(_vtxIds, vtxIds) &&
       CompareArray(_vtxCreaseData, vtxCreaseData) &&
        _level == level &&
       _interpBoundary == interpBoundary)
    {
        return;
    }

    // update topology
    _vertexList = vertexList;
    _edgeIds = edgeIds;
    _edgeCreaseData = edgeCreaseData;
    _vtxIds = vtxIds;
    _vtxCreaseData = vtxCreaseData;
    _level = level;
    _interpBoundary = interpBoundary;

    if(_loop){
        MIntArray triangleCounts;
        meshFn.getTriangles(triangleCounts, vertexList);
        int numTriangles = vertexList.length()/3;
        vertexCount.clear();
        for(int i = 0; i < numTriangles; ++i){
            vertexCount.append(3);
        }
    }

    // XXX redundant copy... replace _vertexList with numIndices, etc

    // create Osd mesh
    std::vector<int> numIndices, faceIndices, edgeCreaseIndices, vtxCreaseIndices;
    std::vector<float> edgeCreases, vtxCreases;
    numIndices.resize(vertexCount.length());
    faceIndices.resize(vertexList.length());
    for(int i = 0; i < (int)vertexCount.length(); ++i) numIndices[i] = vertexCount[i];
    for(int i = 0; i < (int)vertexList.length(); ++i) faceIndices[i] = vertexList[i];
    vtxCreaseIndices.resize(vtxIds.length());
    for(int i = 0; i < (int)vtxIds.length(); ++i) vtxCreaseIndices[i] = vtxIds[i];
    vtxCreases.resize(vtxCreaseData.length());
    for(int i = 0; i < (int)vtxCreaseData.length(); ++i) vtxCreases[i] = (float)vtxCreaseData[i];
    edgeCreases.resize(edgeCreaseData.length());
    for(int i = 0; i < (int)edgeCreaseData.length(); ++i) edgeCreases[i] = (float)edgeCreaseData[i];

    // edge crease index is stored as pair of <face id> <edge localid> ...
    int nEdgeIds = edgeIds.length();
    edgeCreaseIndices.resize(nEdgeIds*2);
    for(int i = 0; i < nEdgeIds; ++i){
        int2 vertices;
        if (meshFn.getEdgeVertices(edgeIds[i], vertices) != MS::kSuccess) {
            s.perror("ERROR can't get creased edge vertices");
            continue;
        }
        edgeCreaseIndices[i*2] = vertices[0];
        edgeCreaseIndices[i*2+1] = vertices[1];
    }

    OpenSubdiv::OsdHbrMesh *hbrMesh = ConvertToHBR(meshFn.numVertices(), numIndices, faceIndices,
                                                   vtxCreaseIndices, vtxCreases,
                                                   std::vector<int>(), std::vector<float>(),
                                                   edgeCreaseIndices, edgeCreases,
                                                   interpBoundary, _loop);

    int kernel = OpenSubdiv::OsdKernelDispatcher::kCPU;
    if (OpenSubdiv::OsdKernelDispatcher::HasKernelType(OpenSubdiv::OsdKernelDispatcher::kOPENMP)) {
        kernel = OpenSubdiv::OsdKernelDispatcher::kOPENMP;
    }
    _osdmesh->Create(hbrMesh, level, kernel);
    delete hbrMesh;

    // create vertex buffer
    if (_vertexBuffer) {
        delete _vertexBuffer;
    }
    _vertexBuffer = _osdmesh->InitializeVertexBuffer(6 /* position + normal */);

    // create element array buffer
    if (_elementArrayBuffer) delete _elementArrayBuffer;
    _elementArrayBuffer = _osdmesh->CreateElementArrayBuffer(level);

    _cachedTotal = -1;
    UpdatePoints(mesh);
}