I want to begin with the report. Thanks. Awesome. Wonderful. So I'm calling to order the August 7th meeting of the African Heritage Reparation Assembly. This meeting is being recorded with the extension of chapter 20 of the act of 2021. This meeting will be conducted via remote means. Members of the public who wish to access the meeting may do so via via phone. No in-person attendance of members of the public will be permitted, but every effort will be made to ensure the public can adequately access the proceedings in real time via telephone means. I almost am getting that by heart. Let's just make sure quickly that everybody can be heard. And I'll start with you, Dr. Rhodes. Are you able to hear us, Dr. Rhodes? I can see everyone, I can hear everyone. And Michelle, sometimes you go in and out. Oh, no. Yes, you are. That's not going to be fun. Is it happening frequently or? No. OK. If it starts to happen at any frequency, I may have to move locations unfortunately. So please let me know. Dr. Shabazz, can you hear us? Yes, I can. OK. And Ms. Bridges? Yes, I can. Excellent. And Jennifer and Pamela, you are able to hear us as well. Yes. OK. Wonderful. All right. So we do not have any attendees, but I'm going to call the first period of public comment because we'll have two, as always. And so just calling this period of public comment, I'll read the statement briefly during the public. Actually, I won't read it. I will wait to the second period when there may be an attendee and I will read it then to be more efficient. I have a hard stop at 12.30 to take my daughter to a doctor's appointment. So and thank you to everyone for your flexibility for meeting at a different time today. So I wanted to begin by first providing an update on some, providing an update on timing as well as some other pieces of the work that we've been doing here. So let me first pull up. OK. So for a variety of reasons, including additional time that I think we need to complete our deliberation on a variety of topics as well as for some other related matters for Irvin and I to have a chance to speak more with the finance department and the town manager, as well as for some other recommendations to have time to be worked out. I would like to move our publication of our final report and our presentation into September. Oh, my goodness. Do we have Alexis Reed? Oh, sorry. Hi, Alexis. Oh, so good to see you. Congratulations. How are you doing? I'm doing all right. I'd show you the baby, but we're a little. I see a hand.  I actually got to see pictures of the baby today at the coffee shop. So excited to have you here, Alexis. Thank you. So I've spoken with the town council president, who also, by the way, was encouraging us to consider moving it into September just for a variety of reasons. There are some major things coming through on the council, as well as I think this is a personal reason I'll share, that we will get more participation from the public in September than we will in August. It's August tends to be slow. So the dates that we have are September 11th and September 18th. Those are both regular meetings of the town council. At this point, they're both open. And we, after we get through this iteration, my plan is for us on the report later today and into tomorrow. OK, am I back? You're back now. OK, maybe I need to stay somewhat closer. So Mati and I are planning to send this committee as well as Jennifer and Pamela and town manager Backelman and our town council president, a draft report tomorrow as it stands. So this will be the draft based on all of the conversations that we have had as well as the conversation today. I am noticing that Matia is not here today and though we'll transcribe the meeting. So does anyone object to us giving ourselves a little more time and moving our publication date from August 21st to one of the dates a few days before the town council meeting in September? Without objection, no objection. No objection. I have a question. I have no objection. But all the information that you will be providing, you and Matia. To the parties you just mentioned, would you ensure that we have all of that to each member of it? Yes, absolutely. And prior to you giving it out first, is that? Yeah, so I think what you're saying is that you would like to see it as members prior to the town manager and Lynn receiving a copy of it. Am I hearing? Absolutely. OK, yeah, so we can definitely do that. And just in keeping in mind, I'll have actually this time, it will be very clear on the document that it's a draft. So we, because one of the concerns is we can't really control what the media does. So by sharing a draft of the report, we have to be clear that it is an iterative process that we're going through and that in order for us to make the necessary changes that we need to make, we do have to have it in a draft form. But that draft is always open to being changed between now and its final approval by this committee. OK, awesome. So any other objections, anything else in terms of timing? And then once Irv, I'm not sure if you saw Sean's email. He just sent an email like about a half an hour ago to the two of us. So once you've had a chance to take a look at that, we can figure out timing. But I think it will be important for us to meet, continue to meet, but to determine which date of the 2 September 11 through the 18th is a better date for the committee once we have a little more clarification from different folks. So what I was hoping we could do today is to continue our discussion on. There were a few things that I wanted to do. One is to continue our discussion on funding priorities. The last two meetings, we have discussed funding priorities. And I'd like for us to continue that discussion as well as to begin to look at and discuss how we would like to create a through line from the eligibility requirements that we've put forward to the rest of the report. So I think that's a discussion that we need to have to so that that it doesn't look like it was just sort of placed in the report without context. We really need to have it be relevant to Amherst and to the recommendations that we're making. So last week, we spoke about the funding priorities of youth programming and youth empowerment. And Matia transcribed the meeting. And so tomorrow, when you receive the draft, you'll see the language that that we have for the youth programming. We also began to speak about affordable housing just at the end of our meeting. And I gave a little update on the Ball Lane development or the formerly known as Ball Lane development in North Amherst. So I wanted to open that up. I'm going to share my screen really quickly. Just to Jennifer, if you might be able to give me access to share the screen sharing. Let's see. Pam was the host because she opened the meeting. Oh, sure. And Dr. Rhodes, I see your hand is up. Is that from is that? That's from earlier. OK, great. OK. Pam, why are you muted? All right. This looks like you should be a co-host now and should be able to respond to that. OK, great. Yep, so I just wanted to, again, review these specific use of funds questions that we had in the survey, not necessarily to value them, but to just, again, remember the categories. So we had buying or remodeling a house, renting a house, starting and improving a business, educational scholarships, symbolic acts, and cash payments. So we have determined youth programming as a funding priority and began to talk about housing. I'd like to continue that discussion, as well as to discuss whether we would like to include educational scholarships, business grants, and symbolic acts and cash payments in any circumstances. So the floor is open now for those discussions. And depending on where folks are at, we can start with housing. But if any of these areas are an area that you would like to bring forward, and again, now taking a look at the responses we received here, you can see that many of these, with renting a home, I think it was a little less popular cash payments, a little less popular. But for example, with cash payments, do we want to make a recommendation? Do we want to include cash payments as a funding priority in a particular instance? Like if you remember, Councillor Walker in our first listening session spoke about what it would be like if we had some sort of emergency fund that was available for folks who fell on hard times or who needed some assistance to make it through. And so is that something that we want to revisit as part of our discussions? So I'm going to take this down and open the floor and welcome any members to speak on any of these funding priorities. Ms. Bridges, are you unmuting to speak? No, OK. I think that I made it clear that I really want to focus in on the youth, especially through the recreation programs, after-school programs, et cetera. So it hits both recreation and education. As far as individual cash payments, I think we all know we have a high hurdle to jump over to do that. Yes, there are some individuals who I believe should have some cash payments. But I don't think we need to use a huge amount of time and effort going through that process. Now, people want to go through that process. And since this is going to be, hopefully, the successive group will be around for a long time, perhaps they would want to pursue this through the legislative process. But youth, as related to recreation is really big for me. And youth, as related to education, is really big for me. Housing is really, really important. And I think that, again, all three of these things, for me, goes back to what I said before, is that we use our funds in conjunction with other funds so that we use them in such a way that we're able to leverage our funds to be able to come up with programmatic goals and objectives rather than us running on our own. We're able to have more of an impact. We're able to induce other people to join in with us to town. And one of the refrains I've heard over and over again in the town is, hey, don't spend money and duplicate services that are already being presented. Add to them and make it additive. Absolutely. And I think that you outlined that in our last meeting really, really clearly. And that has been included in the language that we're developing for sort of the overall philosophy. The combination of what you and Dr. Shipaz contributed around that, I think, is really powerful as it's been developed. So that makes a lot of sense. Irv, can I just ask you a follow-up on housing? Because I have personally heard you speak to this a number of times and that I know you are just generally advocating for home ownership as opposed to or maybe in addition to rent being able to rent. So I'm curious if you think the report should focus specifically on ownership or is there some combination that you envision? Right. One, just as background and just so I'm all transparent here is that I have been working on an affordable housing program for a national basis for the last two years. It is now formed into where we have a managerial team and administrative team, a legal team, a mortgage banker, mortgage financing, and we're getting ready to launch nationally in September on a national fundraising platform. And the whole idea is that we're focused in upon home ownership on two levels, one for those who are below 80% of AMI and for those who are above 80% of AMI. And the reason for that is if when I look around, we look around the nation, the low income housing in terms of incentives and government support are supported way more than the one for incentives for those above 80% AMI. And what we see happening is that having that dichotomy above 80% AMI, we're talking about workforce housing. Workforce housing for teachers, fire people, police, hospitality workers, et cetera. And the reason for that is that that is the middle class. That middle class has been devastated. And the support for funding of that is not there. You can just look around our town and you can see that. And that can be generalized to the entire country. So what I look at when I talk about affordable housing is support for affordable housing for those below 80% and for those above 80%. And I'm talking about incentives that the town can provide, incentives to developers, incentives for home purchasers, et cetera. What we are focused upon is all across the board. And when I say all across the board, it's not only for new development, but it's also for buying up apartment buildings and turning them into home ownership opportunities. Via townhomes. And the reason for that is because across the country, large investors have purchased apartment buildings, raised the rents. And so now what you have is that we have a huge large segment of our population, both low income and workforce housing people, who are rent burden. I mean, they're spending more than 30% of their income on rent. And it's a tragedy across the country, a tragedy. And so we believe my group, my team, through available financing means and financial technology that we can relieve that problem. I seen here in Amherst that the problem is so severe that both groups are priced out. We in Amherst, we say there is a wealth gap. Well, it's obviously a wealth gap because we have huge amounts of money being spent on low income housing. And that is desirable. On the other hand, we're not doing the other part for the middle class housing. So what we're creating in this town, which is married nationwide, is a two class system. They're very wealthy and very poor. Anywhere I could go on them. But anyway, there you are. Yeah, thank you so much, Dr. Rhodes. It's really insightful. And so I think we can figure out how to take that and put it into our recommendations. One of the things that I keep thinking and coming back to is the amount that we will have each year, whether it's $50,000 or $100,000, we have to think about how we can stretch that money to impact not only the most amount of Black residents, but also to impact in meaningful ways. And so I was speaking with Jessica Ball Lane about down payments. And for that development, folks who are interested in purchasing homes there will be required to go through the same sort of process that anybody would. And that includes learning, going through the coursework for being a first time home buyer and having enough savings to use as a down payment. And then also being able to sustain the cost of living, utilities, and everything else that's involved in purchasing a home. So that was really helpful to get that context from her. Dr. Shabazz, you've been so patient. You're up. OK. I'm glad as we wind down our process to find myself once again in agreement with Dr. Rhodes, the I just would like to build upon his emphasis on prioritizing youth, young people. This town we're in is a college town. Its majority of its population throughout most of the year, as we know, is a youthful population, is between 16 and 25. And therefore, it makes perfect sense for a Repairative Justice program to really highlight the needs of Black youth in terms of the future of where we are going as a people. I would say as well, it's not just a youth empowerment center. We really ought to broaden out our thinking in this area to include scholarships, to include problems with our high school. We met with high school students. We know about the problems. I feel unfortunate time got away. We never were really to engage with the school committee and with the school. Of course, they were going through problems of their own in regards to LGBTQ and other kinds of equity issues. And so it just didn't work out as a good time to really try to engage with the school system about particularly the ways in which Black youth, African-American youth, the children of freed people, can be better supported in the school. But we can certainly highlight from our listening sessions and from our work many, many points. One of the things that was in the original reparations for Amherst report about issues that came up in their initial study and survey around the schools was the lack of the college going rate. The lack of the disparity in graduation rates of African-American youth to the general students graduating from Amherst Regional High School, but also the college going rates. There was a serious disparity. How can reparative justice help to address that? We can't close the wealth gap. We don't raise enough money here in Amherst to be able to close the wealth gap for all of the families of our Black youth here. But we can do things to better support them in the school in terms of taking more challenging college coursework. I don't like to just say AP. It can be honors coursework. It can be coursework in a variety of ways to support that. How can we better support our young people in terms of the counseling? I know when my child was there, the counseling services, particularly in trying to prepare and promote Black youth to go to college was deplorable. Was deplorable, okay? So how can we better support the efforts of the counseling staff there to know particular ways from the research-based literature, from the various expertise that's out there about how to promote the thinking of Black youth about going to college and the kinds of opportunities that are out there from the community college to the comprehensive tier one universities like UMass. This is something we can do. This is something we must do. So these are, I'd like to really just build out when we say youth, we're not just talking about their access to recreational programs and helping to pay their fees if they wanna be on the football team. Those are valid issues too, but I'm talking about some of the more serious things that have come up in our community that has been brought up in our community. Also, questions of helping to young people to know their rights, to know their rights and interactions with the police, to better foster their interactions with the community safety systems that we're trying to develop here with Crests and with other kinds of ways that we're trying to develop here in Amherst so that our young people are not the victims of racial profiling and are not the victims of interactions with law enforcement that seem disparate, even as happened this past year at UMass with a young person who veered off the instructions on the roads as we know about. So I just think there are ways in which we can try to better support our youth in a very broad sense, in a very broad way and that this can be done and must be done as part of our project. I will also, with the additional amount of time, I hope to have some thoughts for the committee to look at regarding peoplehood. It's more than just symbolic acts. That's how we refer to it in the survey, but it really has to do with how do we decolonize this town? How do we emancipate ourselves from mental slavery? Even where the chains of slavery, shadow slavery were ended in the 1860s, we understand that the mental enslavement of everybody, not just black people, but of everybody to racism and to a racial system of white supremacy is something we have not decolonized. We haven't broken away from in this town sufficiently from our curriculum in our schools, in our schools, as well as into the landscape, the built environment, the lack of any kinds of streets and markers and whatnot that indicate our presence and note our excellence in this town. So I will have time now to prepare a few comments on that, but I think digest the work that we've done over the last two years that hopefully we can tweak and we can reach consensus on. That's all I'll say at this point. Thank you. Thank you very much, Dr. Shabazz. And I just wanna come to Alexis. I did see Alexis, your hand came up and then went down. So I just wanna check in with you before going to Dr. Rhodes. Yeah, really quickly. I wanted to first thank Dr. Shabazz for saying that because I completely agree. And I guess I was just going to like sort of just piggyback off of that and like add mental health and conflicts resolution as well. But I don't, I think that he did a fine job of saying like reaching youth more generally. No, you make a good point. Thank you for adding that. What was that, Dr. Shabazz, in your response to Alexis? No, I just said yes, I agree. Thank you for adding that. The July 5th incident, how we can prevent things like that from happening, conflict resolution, how we can support in terms of mental health issues. I completely agree. Thank you. Thank you. Thank you, Alexis, for adding that and Dr. Shabazz. Dr. Rhodes. I wanted to briefly come back to my comments before in terms of housing. And I was particularly impacted by what you said about the ball lane and how they're going about doing that. One of the things that the company I'm associated with wishes to do is to eliminate the very information barrier that the company has over the last four years. Our company has a digital backbone that includes all available financing for housing from public sources, federal sources, private sources, accept your all-in-one digital framework. And the reason for doing that is that there is a disconnect and information to have available. So when you said they're going to require down payment, while there are programs around the country, including national ones that are both public and private that provide down payment assistance. And without knowing that, ball lane could go ahead and say, well, you gotta have a down payment. And the person doesn't even have an idea that there is available assistance there. And I guess the point is that sometimes local, we at the local level feel that we're doing everything possible, but we are lacking in the overall, lacking in overall information that can impact what we do locally. And that does not need to be, especially when it comes to African-Americans. Absolutely. Thank you for that, Dr. Rhodes. Yes, Alexis. Okay, I'm sorry. I just, I have to run, but I'm so sorry to like come in and go, but I just wanted to say bye. Thank you everyone for all your hard work. Baby says hi. Beautiful. Thank you. Thank you. Okay, take care. Thank you. Thank you. Okay, see you. Bye. Bye. What did you say, Dr. Rhodes? I said that baby looks like it's not missing any meals. I bet it's not. Oh, that's good. Okay. So there's still four of us. Okay, good. So wonderful. Thank you for adding that, Dr. Rhodes. So just coming back then, I think we have quite a bit to contribute to the report around housing as well as the youth at this point. And I got the message, Dr. Rhodes, that about education and how that fits into it as well. What do we want to say in terms of business development? Business grants, do we want to make that a funding priority for the town, for the successor body? And what do we want to include in that recommendation? Well, we look around Amherst, in terms of the town of Amherst, the number of black-owned businesses is remarkably noticeable. And someone that has to do is with the ability to start businesses, to start a business when these knowledge, information, know how, and an entrepreneurial spirit. And if you do not have those things in places, it's really, really difficult. This town, as far as I am concerned, does not allow, does not have the entrepreneurial infrastructure for ordinary citizens to take advantage of. From entrepreneurship programs, through financing, through a legal framework, all those things that are necessary. And so you have to start somewhere here in Amherst. And for me, again, there are two levels to it. I want to, again, I would like to offer entrepreneurial programs to the youth. There are a number of different models out there, and I'm familiar with them, and have taught those entrepreneurial programs for kids three through high school, third grade through high school. Those are available, and I consider those to be incredibly fundamental to establishing an entrepreneurial culture in this town. And that has to happen. And that's something I, well, I'm working on now with certain people in town. And I'd like to see that happen. I'd like to see it integrated again in the schools. I'd like to see it integrated with the programs we're talking about in terms of recreation, because that's part of their charge. And then up again, the other level is for adults, the same kind of thing, not only just the ability to start a business, but also having the infrastructure that would allow people to be able to start a business from the legal to the financial. We do not have that in this town, and we need to have it in this town. And there are models for having, models for making that happen. So yes, that has to be for my two cents. We're in this society, it's a capitalistic society. It runs on people's ability to earn money. But it also runs on people's ability to go out and find new ways of doing things and offering that back to the public. And that needs to be bedrock here in this town. We do not have, especially again, for African-Americans, it's all for all levels, but for African-Americans not to have thriving black businesses in this town, except for one here in South Amherst. Yes, that's an embarrassment. Thanks, Dr. Rhodes. And I really appreciate the way that you've broken that down between the youth and just developing that culture of entrepreneurial spirit and also knowledge. And then the adults being able to have access to the resources that are required to start up a business as well as sustain and thrive, as you said. So I think that's a really great starting point and certainly ties in the youth piece, certainly ties in, as you said, with everything else we've been discussing around the youth. So that's great. Would Dr. Shabazz or Ms. Bridges like to add anything right now or Pamela to the discussion on business? Okay. Not at this time. Okay, so that was, there was the business and then there was, and we touched on it briefly, cash payments, if we are to include any discussion in our report regarding cash payments, it will have to include the need for special legislation. So we'll at least want to give the reader and the council the information that was provided to us by KP Law regarding what that legislative process would look like. But I would like to know if the committee has clarity yet around whether recommending that we pursue or that the town pursue that special legislation. And if there are particular instances where we see cash payments, cash payments clearly are the least, I think, popular for variety, for many people. That's not true for many people. They're sort of seen as the most challenging, I guess, is a better way of saying it. And we know that the special legislation would be needed for such a benefit to be made. So any discussion on that at this time? And do any members have strong feelings one way or another? Yes, Dr. Shabazz. Okay, so a couple of things. I think one is as part of our municipal plan, it really is to give to the town and to the successor group that we hope is created something of a roadmap on which to build the infrastructure of a Repairative Justice program. And so I do think we ought to, in the appendix, provide the KP law review that we ought to also comment on that in terms of what our research into the next steps to pursuing that, what are some of the challenges, what are some of the, as well as some of the benefits for doing so. On the challenge side, as I recall, the discussion was around number one, the fact that the town already has a queue of home rule measures that it is pursuing. I understand rank choice voting is one of them. I understand some other counselors have begun to throw up some other stuff for home rule legislation. And when our piece was brought up, then it was like, okay, well, there's a queue. So I don't know fully where that really stands and where we may stand in terms of having this in the queue, but that was one sort of challenge that came up. The other challenge that came up or consideration from my discussion with one of our legislators at the state level, is the idea that at the state level itself, the issue might be, well, why just grant this for Amherst if there are other municipalities looking into doing the same thing, i.e. Boston, i.e. Northampton, i.e. wherever else. And therefore, rather than approach it on a one by one basis and, okay, let's do it for Amherst now, the state may wanna have a conversation about whether to create a kind of statewide process similar to the Community Preservation Act, where any municipality wanting to do some type of direct cash benefit, reparative justice work would already be covered by the state level legislation. And to that I say, well, fine, but how can Amherst and how can our AHRA plan be a call to the state to initiate that statewide action in terms of some of the bills that are out there in terms of our own legislators perhaps proposing a bill to create a kind of statewide CPA type structure, Repairative Justice Act that could provide a statewide structure for any municipality wanting to do a direct cash benefit type Repairative Justice action. So I do think we need to report on our findings, report on the challenges as well as the benefits. We do know there are instances where we have encountered issues that it might very well be that the town would want to support in some way with direct funds, issues of to repair specific injustices. I think of the Coleman family. I think of whatever is happening there in terms of the discussions with Amherst College. How might it help if the town also said we would put up so much funding for a home or for something to be made right in terms of the Coleman family. Likewise, we haven't discussed specifics of how our first African-American full-time faculty member at UMass who was so ill-treated in this town whose reception in this, trying to find a home in this town. Speaking of Dr. Edwin Driver, we still have not directly considered what might be an appropriate way to on the part of this town, but one cannot rule out some type of cash benefit as a part of that process, even if it's only in whatever it might be, however modest or significant it might be. So I think there are benefits to having that option on the table for the reparative justice process. And I think there are clearly challenges with how to move forward with respect to state government giving us the legal cover and the legal support to do this so that we would not then be in jeopardy of counter of the lawsuits for us to do this type of thing. So I rather to be able to do it on a legal framework given that there is state law that does not allow municipalities to make those kind of direct cash payments to any citizens for any reasons, unless it's declared a public purpose. So those are some of my thoughts and reactions to that issue. Thank you, Dr. Shabazz. That was really helpful. And I think that our recommendation can be a discussion that outlines those benefits, the challenges and provide information that we've collected in our work. And then also to have a discussion and that recommendation around solutions. One of the things I think a lot about is coalition building and how there is usually a load star and Amherst in this case can be the load star for this particular matter to get it put into the wider discussion and then we can recommend that the town build coalitions with other communities and community organizations who are interested in this. I think one of my goals for this report is that we are modeling a process and sort of a roadmap as you said Dr. Shabazz for repair but also that we are normalizing this, that it's not shocking for one to think that having a reparative justice plan for a community's black residents, it's not shocking. It's sort of normalizing that this is a long overdue and that we're simply providing this roadmap. So those are some of my thoughts. It's 12, 24 and Jennifer asked that we approve minutes that are on the agenda before we will have to call a second public comment period, excuse me. So I'm gonna just grab the agenda here to make sure I have, I'm going to move that we approve the meeting minutes from April 10th, 2023, April 24th 2023, May 8th, 2023 and May 22nd, 2023. Is there a second? Second. Second. Thank you. Any discussion on that, Dr. Shabazz seconded that motion. I'm gonna go to a vote, Dr. Rhodes. Yes. Ms. Bridges. Yes. Dr. Shabazz. Yes. I am also an aye, so those meeting minutes are approved and that's excellent. So I'm going to call our second period of public comment and we do, I think it's just Matia who has called in. So I don't see anyone else in the attendees but there is a second period of public comment open. All right. So just to reiterate the plan here then we'll get because I accidentally forgot to inform Matia that we were meeting today at 1130 as much as we are in communication. I thought I had communicated that. So she missed half of the meeting. So Pamela, if it's possible for you to send me the Zoom link so that she can have the meeting transcribed as soon as possible, that would be great. So we'll work on getting new committee members and only to committee members and Pamela and Jennifer at this time. This is gonna be our first like substantive, I think draft based on all of the discussions that we've had all of the various communications that I and others have been having. So it will be important for everybody to review it carefully and to be prepared the areas that we still have yet to discuss. Pamela. One of our recommendations that we lost you for a minute. Okay, how about now? You got me back? Okay, you froze for a little while. Okay, did you hear, where did I, where did I freeze Ms. Bridges? What was the last thing you heard? Pamela, you froze for me at getting Matia a transcript. That's where you froze for me. Okay, thank you. Okay, what I was saying is this draft that we're going to share with you is probably the first really substantive draft and it will be important for us all to carefully review it before our next meeting so that we can at our next meeting have feedback. Did you hear me? You froze again. Well, the last thing that we heard or at least the last thing that I heard was that it's important for the members of the assembly to carefully review the draft because this is the substantive draft before the next meeting and that's where you froze. Me too. Okay, perfect. The last piece is just that I will indicate in the report Matia and I will indicate in the report the area is that we still have to deliberate on in our next meeting or so. So I would be prepared for our next meeting if everybody can be prepared to stay for an hour and a half next week, beginning at two. I think that will get. Did that all come through? Okay. All right. Are there any? What was that Pamela? So you froze again, but the last thing that you said was just asking everybody to be prepared to stay for an hour and a half at the next meeting which we'll begin at two next week. Perfect. Okay, any other comments or questions before I adjourn the meeting? All right. Once again, a really wonderful discussion. Thank you very, very much and we will see you next week and I'm adjourning at 1229. Thank you, Michelle for everything. Pamela, thank you. Okay. Bye.


Patriot Prime Reviews is a channel for adult collectors and may not be suitable for children under 13 years of age. Viewer discretion is advised. Hey, what's going on guys? Patriot Prime here once again with another video review. But before I get started, I need you guys to do me a favor. If you're watching this video right here and are not a subscriber of Patriot Prime Reviews, please hit that subscribe button right now. It won't cost you a thing, but will help me and my channel out tremendously. Now, on to the review. And this review is on something that I have totally picked up on a whim. Every time I go shopping at my local Walmart, my only option, I have walked by this figure multiple times. There have been quite a few times where I'll pick him up, I look at him, walk around with him for a bit, and then end up putting him back. But the other day I was in the mood to buy something, went Transformer hunting, didn't find a thing, finally picked this figure up. And the figure I'm talking about is the Walmart exclusive Robbie the Robot from the movie Forbidden Planet. This Robbie figure is a pretty big one. He's big, he's bulky, he's electronic, which is what's really cool. Push the button right here, he lights up and talks. Okay, there we go. He's got some articulation. I can't really tell what all he does because I haven't taken him out of the box yet. He says he walks, he talks, all this for only $20. I mean, think about it. You got a $20 electronic figure, you got a $20 Transformer. Oh well, now this figure is made by, well on the back it says Trendmasters. But down here in the corner it says Gold Lock. So I really have no idea who makes this guy. Somebody down in the comments will correct me. But this is really cool and he is a Walmart exclusive. He's down on the bottom shelf. They also make an Iron Giant figure. I got the Iron Giant figure a couple of months ago for my son. He loves the movie. Just never grabbed this guy until a couple of days ago. And one of the main reasons I got him is not only is Robbie a robot icon for us sci-fi fans, he is the logo of Toy Hacks.   Now he made his first appearance in the 1956 film Forbidden Planet. And ever since then he has featured in multiple sci-fi movies and TV shows. So enough of me rambling on about the figure. Let's go ahead and get him ripped open out of this package and take a look at him. And welcome to Patriot Prime Reviews. Now, once you get Robbie all open and out of the packaging, you'll see that he looks like he just stepped right out of the silver screen. I love the sculpted details on this guy. He looks awesome. Now there's not a lot of coloring, but that's the way he was back then.   He's got these little things up here. Now I wish these spun, but they don't. They're a soft plastic or rubber here on the back. He's got a speaker, his switch for his different functions. Now he does have articulation here in the arms.  And there is a wrist rotation. And that's pretty much it for the articulation that you can do with him. That's other articulation that is motorized. Now, as I said earlier, he is electronic and he has a few different features. The switch right here on the back, as I showed earlier. One, if it's switched over here, all he's going to do is his lights and sounds.  Hopefully this will show up. That's his first clip from the movie. Second clip, and this one should be old sci-fi sounds. Yeah, you couldn't watch a sci-fi movie back in the day without hearing those sounds right there. Now you flip the switch on the back, hit the yellow button again, and he's going to take off walking while doing all of his different sounds.  That's really cool. It's hard to believe I only paid $20 for this thing. So go ahead and turn him off. Now the hard thing is trying to get him to turn off so he's straight.  He got two that go in this foot and two that go in that one. And you can see he's got wheels right here that help move him along. So now, for a quick size comparison, here is Robbie the Robot with Generation 1 Optimus Prime. Robbie's case mate, the Iron Giant. Diamond Selects Maximillian from the Black Hole. And War for Cybertron Siege Commander Class Jetfire. Robbie the Robot is a really cool addition to your collection. I mean, you get a lot of bang for your $20. And I highly recommend this guy. If you're in the action figure aisle, especially with the Transformers, you'll find him there on the lower shelf with his buddy the Iron Giant. Now I didn't go over the Iron Giant because Dylan's already broken.  So does a Robbie the Robot belong in your collection? Absolutely. If you're a sci-fi or robot fan in general, you need to have this icon on your shelf. This guy is fantastic looking. I love the electronics, the gimmicks, and for only $20. I mean, my God, why not pick him up? This thing is awesome. Now, as I said earlier, Robbie here is toyhacks.com's mascot. And Toyhacks, if you're listening, I know you make weapons. So why don't you make the weapons to make him look like he does right here on your Toyhacks Armory card? I would so love to have a Robbie armed to the teeth like that. That is so cool. So yeah, you see this guy on the shelf. Pick him up. Don't hesitate. Don't be like me and wait months to pick up this guy. He is awesome and I couldn't be happier. Now guys, if you enjoyed the video, don't forget to like, don't forget to subscribe, and don't forget to hit that bell icon to get notified when I upload new reviews. Once again, this is Patriot Prime, signing out.


Welcome everyone. We'll have a talk by Roberto de Yoris. He will talk about Python using modern OpenGL and we'll have about 15 minutes for questions at the end. So please welcome Roberto. So, hi everyone, I'm Roberto. Some of you may know me for the Uwiss-Giou project. I'm the lead developer of it and some of the open source project. While I'm heavily involved in networking programming, my true passion is game development. How many of you are into game development? How many of you want to become game developers? Oh, yeah. During my programming life, I wrote about 12 game engine in various languages, two full games and since 2014, I'm a teacher at AIB, that is Italian video game academy, where I'm a programming and computer graphics teacher. Today, I would like to show you how to use OpenGL for making your games in Python. First of all, why you need OpenGL or DirectX, Metal, Vulkan for writing your games. Those are APIs for your graphics cards. Hardware vendors invest thousands or billions of money in their technologies, especially now that GPUs are the bad words in the hardware world. Every vendor has its internal way of programming their hardware. We need an abstraction from the driver to the way we speak with the graphics hardware. OpenGL, DirectX, Metal, Vulkan are all libraries allowing us to interface with the driver of the graphics card and to the graphics card by itself. DirectX, Metal and Vulkan are all equivalent to OpenGL. They do almost the same thing. DirectX is the Windows Microsoft implementation of OpenGL. Metal is the Apple implementation. It's pretty new. It's from 2014 or 2015, I don't remember. And Vulkan is the latest, is the newcomer in the API world. It should be an evolution on OpenGL. We will talk about Vulkan in the last part of the talk. Why choosing OpenGL? It is an industry standard, drafted in 1991-1992 by Silicon Graphics. I hope you know them. They are not called SGI. The OpenGL now is controlled by a no-profit organization that is Kronos Group. They are at version 4.5 of the standard. There is a lot of documentation because being an industry standard, this is something you can learn at the university. And most important, portability. Basically, OpenGL is available on all of the operating systems out there, from Android, Linux, Mac OS, Windows, and so on. I would like to start with a disclaimer. Those libraries, APIs, are heavily C-oriented, seen in the mean of the language. And performance and compatibility are the main objectives, so do not expect a lot of Python-ish way of programming. What we need to do to draw on the screen of our computer? This is the optimal way. First of all, we have to ask our operating system for something drawable. It could be a window or the whole screen. We have to agree with the graphics card on how to represent a pixel. We could use 3 bytes for a pixel, holding 8 bits for each color component, RGB. RGBA, if you want some kind of alpha for transparency or for some custom data. We could go black and white, so we could use a single bit for represent a pixel. It could be black for 0, white for 1. Once we agree with the graphics card on how to represent a pixel, we have to allocate a memory chunk for our canvas, something we can draw on. It could be an array of bytes with the size of our window, of our screen, 640, 480 for a standard old-style resolution. Multiplied battery, because we need 3 bytes if we choose to use the RGB pixel format. Once we have this chunk of memory, we can start to write in pixel data that are basically the color we want to write on the screen. Into this memory, we just allocate. Finally, we have to transfer the whole chunk of memory to the graphics card.  It is really slow. We need a lot of memory. Think about to know what is. We have full HD games. We need 1,920 for 1080 for RGBA bytes and a modern game and a modern player expect a game running at 60 frames per second. So you have to multiply that big value for 60 per second. Imagine the load on the hardware bus. But we have game by 40 years. How do old programmers solve the issues? First of all, we were in the 2D era. There is no third dimension. First week was using time maps. We divided the whole game world in blocks. We built a big grid of our game, something like a puzzle. We had dedicated processor hardware dedicated to moving things on the screen. We have very few colors. If I remember correctly, a NES, Nintendo, has 16 colors. Maximum of 16 colors for the whole screen. Very low resolution in the order of 320 for 2040. Even lower. There were hacks all over the place and forget about real-time 3D. This is Super Mario for the NES. You should check how you can see a repeating pattern for the blocks. I don't know if some of you have played this game. It's pretty modern. It's for Nintendo Wii U. Basically it is a game allowing you to build your Super Mario. Dragging blocks on the screen like we did in the whole days. So you have your pieces and plays on the grid on the map. This approach was good for more than 10 years. Then in the start of the 90s, thanks to Carmack, Romero and those funny and powerful developers, they started investigating 3D support. The first approach in 3D was using the raycasting technique. It is really simple and really fun. Basically they divided the whole game world in vertical slices. One slice for each vertical pixel. So if you have a resolution of 200 pixels, you get 200 slices. Then from the point of view of the player, from the virtual camera, they shoot a ray and the longest the ray is, the littler will be the drawing line. Check the figure on the right. This is what you can get with all this time tree. Unfortunately, raycasting is not true 3D. We have basically no way to put walls on a higher plane or have thinner walls. What you can see on the right is actually what you get on the final image. All the game is divided in vertical slices. The wall on the left is nearer to the viewer, so it's higher. 20 years ago, the consumer world started getting accelerated hardware for gaming through the effects to do. We had the first integration libraries, Glide MiniGL. They are sort of embryonal OpenGL implementations. Allowing the developers to use the hardware acceleration for having a real-time 3D. In 1998, we got Unreal from Epic Games. We started getting a real 3D. We can move on the its own axis, z-axis, x-axis freely in our game. Nowadays, we have a really powerful hardware. Most of the research in the hardware area are done on the GPUs, on our graphics cards. So we have a lot of hardware power. We are basically in a duopoly between NVIDIA and AMD. The most important thing is that nowadays our graphics cards are programmable. We can choose which kind of code they will run. This is Babbo, a game from 2015. If you haven't played the game and if you don't know it is a game, you hardly tell this is not a photo shot, but a real-time game. This is for PlayStation 4. Trust me, PlayStation 4 is not the most powerful hardware you can find around. Maybe it is near to an entry-level PC you can buy for a few hundred dollars. Even if it's a pretty cheap hardware, it can run something like that. What is 3D graphics? How we can accomplish this? From a mathematical point of view, 3D graphics are pretty near to industrial design. Basically, we define each shape of the world in the form of polygons, maybe triangles. Each triangle is defined by three vertices. Once you have defined those shapes, you have to figure out applying projection. It's a very simple math.  Once you have built the geometry of your game, you have to rasterize polygons, accounting lighting and texture. Rasterization could be unknown to you, but it's a really simple procedure. You have a triangle made of three vertices. Rasterization is the process of dividing the triangle in horizontal slices and filling them pixel by pixel. This is Leon from Resident Evil 4 by Capcom. You will see what the 3D artist will give you.  Then you rasterize them, the image in the center. Then you apply a texture on it. Don't be worried. The rasterization does not end by itself in that kind of images because it has a depth. The central image gives you this sense of depth because we have taken into accounting lighting. The final step is texturing. What is a texture? It's basically a 2D image that we place around our model. Imagine like placing a paper around a box. This is another example, as I said, created from Ubisoft. On the left we have the geometry. On the right we have the final result. Time to see some code. Let's do this with Python. First of all, since four years ago, the logic of a game engine is basically the same. We have a central loop. Imagine it's a while through, a while window is open. In each cycle you clear the screen, manage the input, update your game logic, this object move there, redraw everything back to one. The first thing we have to do is asking our operating system for something drawable.  In AIV we have developed a bunch of abstractions for allowing students to start using OpenGL as soon as possible. These libraries are open source. I will give you the GitHub account at the end of the talk. With the window class we ask the operating system for a drawable context. Then we enter our game loop. It will run until the window is opened. And we ask the graphics card to redraw everything it has in its color buffer. Color buffer is basically the representation of each pixel on your screen. Prepare your eyes for some noise. Basically the graphics card is drawing what it found in its memory. But we haven't put anything in its memory, so that memory is full of garbage. This could be even a security problem if you think about it. Now we have a graphic context we can start talking with our graphics card. The first thing we want to do is clearing our color buffer. As I said earlier, the optimal approach of having a local representation of the memory on the graphics card on the screen is really slow. One of the first instructions you have to deal with when programming graphics card is the possibility to fast clear what you see on the screen. This is one of the first functions exposed by OpenGL. To use OpenGL in Python, you have various solutions. You have PyGlet, PyGame, PyOpenGL. Personally, I use PyOpenGL because it does not offer a Python abstraction over OpenGL, so it is a good way to learn how OpenGL works. You don't need to compile anything. PyOpenGL uses Ctyes and Doompy for all the array and byte array representation. Let's change our code. First of all, we include all of the OpenGL functions. OpenGL is composed by C function prefixed with the GL string, and they have no structure. They only work on primary data, float, integer, nothing more. It is very easy to use Ctyes for implementing OpenGL. Now, at every refresh of our screen and at every cycle of our game engine, we send to the graphics card, please, clear the color buffer using the GL Clear commands. Now, we have a black screen because at every redraw of the screen, the GL Clear command is filling our color buffer with zero. We can tell OpenGL to clear the color buffer with a specific color. We will fill it with zero. This is a red. The last items is the alpha channel. We leave it as one, so it's fully colored. Taking account that while in HTML you could be used to colors starting from zero to 255, in OpenGL, generally in 3D graphics, we use normalized value, so colors go from zero to one. So 128 will be 0.5, and we have our red clearing. Now, we want to start drawing something. Before drawing something with OpenGL, you need an OpenGL context, and we already got it using the window class. We need a bit of computer graphics theory, nothing extreme, and we need to know GLSL. Unfortunately, the last part is the hardest one. GLSL is the programming language we use to program our graphics card. It is a pseudo-C, it is a dialect of C, it is not very hard by itself, but it requires you to know what to do with your graphics card. Once we have our tool, we have to agree on conventions. There are a lot of conventions in 3D words, in computer graphics world, in desktop design, and so on. The first convention in OpenGL is that all is right-handed. Right-handed means the epsilon goes on top, the x goes over right, and the z goes over the viewer. So z1 means over me. 0, 0, 0 is the center of the world, and in OpenGL we use column-major matrices. Do not worry if you do not know or do not remember matrices, they are pretty easy, we will cover them soon. Why this talk is called modern OpenGL? Because till 7, 8 years ago, we were still talking about the static pipeline. You continuously tell the graphics card, please draw these vertex at this position. Draw another vertex at this position, draw a triangle, and so on. There was a continuous transfer of data between your application and the graphics card. A lot of algorithms or computer graphics were coded into the graphics card, so you could not implement new algorithms. Think about the first PlayStation, PSX, you were able to use a single way of implementing lights. But they were really easy to start with the old OpenGL. At the first tutorial, you were already able to draw a cube. Now, after three tutorials, you can barely draw a triangle. Which is the difference? What is modern OpenGL? First of all, graphics card became really powerful with a lot of dedicated memory.  The only algorithm you will find hard-coded into the card is the rasterization via interpolation. Nothing more. All the rest you have to implement with GLSL. As it is a programming hardware, we could start talking about GPU. They are really GPU. Unfortunately, as I already said, they have a modern OpenGL as a really high learning curve. The shortstopper for newcomer is this GLSL. It's sent for OpenGL sharing language. It is not hard by itself, but you have to know how to use it. So, to draw something with modern OpenGL, you need to do those steps. First of all, define a vertex array object. Think about it as a way for shader to assess stream of values. Remember, shaders are code that is run by your graphics card. Once we define this vertex array object, we need to start uploading data in our graphics card. Data could be vertices, could be textures, could be normals. Whatever is required by your object to be drawn. Then we need to code and upload into the graphics card our shaders. Shaders are compiled by your graphics driver. Then we issue a draw call. We tell the graphics card to start executing its shaders. The draw call is called a devry game cycle. Once we issue the draw call, the vertex shader, the code wrote for the vertex, is executed for each vertex. If our mesh, if our model is composed by 1000 of vertices, the graphics card we will call 1000 times the vertex shader. Every time we get three vertices, we have a triangle, and so the graphics card can start the rasterization. The rasterization will generate a lot of pixels.  This is a huge amount of load for the graphics card. Why it works well? Because GPUs are engineered for being extremely multi-core. There are GPUs that have 500 score and even more. All of these stacks are heavily parallelized. First step, we want to create the bare vertex array object. Bind it. Binding is the way for OpenGL to tell the graphics card from now on this is the value you have to use. You can generate a lot of vertex array objects in your graphics card memory, but we have continuously tell the graphics card which one to use. You do this with the binding. Then we create a vertex buffer object for our vertices. We upload the vertices to the GPU, and we tell the vertex array that is first item will be the just uploaded Vubio. Defining a triangle, I suppose it is a simple task. A triangle is composed by three vertices that could be represented as three vectors, X, Y and Z. Vector 3 or Vector 2 if you are in 3D or in 3D. The final step is how many data you need representing a triangle. Once we have uploaded our data to the graphics card, we can start implementing shaders. We write them in this pseudo-C. We compile them and we upload them in the graphics card. Let's start by drawing a simple triangle. Nothing new here. We set the clearing color as red as before. Then we ask the graphics card to allocate one vertex array. This one here is for telling the API allocate one. This is clearly an hardware engineer's choice. No novice will implement an API in this way.  Once we create the vertex array, we bind it, so we tell the graphics card from now on everything we map to a vertex array is referred to this vertex array. Then, in the same way, we generate a buffer for holding our vertices. We bind the buffer so everything we write into a buffer will be referred to this buffer. We build using NumPy an array of vertex 2. We are drawing a two-dimensional triangle. These are three vertices. With this function, glBufferData, we upload those data in the graphics card. With this code, we map the buffer to the index 0 of the vertex array. So the shader, we will get hashes to this buffer. Then we start writing our shader. This is the vertex shader. This is the code called for every single vertex. This code expects to set a glPosition vector 4. In 3D graphics programming, we use vector 4 instead of vector 3. This is a mathematical trick for allowing easy combination with four-by-four matrices. We will see that later during the talk. In this code, we inform the shader that he will get a glPosition 0, the first index of the vertex array, vector 2 structures. So basically it will get two float for each vertex. Then in our main function, we set glPosition, transforming vector 2 that is vertex to a vector 4 because the glPosition expects a vector 4, adding the z component to 1, and the w in vector 4, the fourth element, is the w by convention, to 1. If you're asking yourself what is w, by convention, when w is 1, it is referring to a position. When it is 0, it's referring to a direction. In this case, our vertex is a position in the space, so we set it to 1. This is the vertex shader. And this is the fragment shader. Here we decide which color our pixel will have. In this case, we set the color to magenta, I suppose, some kind of pink. With this code, we compile the shader and link them to a program. We bind the current program, so the graphics card will know which code to run at every draw of the screen. And finally, we issue our draw call. We are asking our graphics card to draw triangles, so every three vertices, it will start the rasterization. Okay. Pinky triangle over a red background. Our graphics card has basically a single algorithm encoded in its GPU, and it is the interpolation for doing rasterization. Basically, everything goes out from the vertex shader, is interpolated. So if we tell the shader that in addition to GL position, we spit out another value, that value will be interpolated. In this case, I'm using the triangle vertices like color. So if the vertex of the triangle is in position 1, 0, maybe it will be mapped to a red. I generate this value, and I tell in the fragment shader to use that value as the color. The result is that from one vertex to another, we will get a blending between colors, automatically done by the graphics card. Why this triangle is draw in that way? Because when you start a context in OpenGL, you get a screen, large two units. Do not worry about how big is a unit in OpenGL. From a mathematical point of view, it's not relevant. You choose what is a unit. It could be a meter, a centimeter, what do you want, a kilometer, if you're developing a solar system. But if I start with a width from minus 1 to 1, an 8 from minus 1 to 1, and a forward from 1 to minus 1 is the inverse. So we are basically into a cube. In fact, our triangle fill the whole screen because we are going from 1 to minus 1 and so on. Now in this, we can start toying, playing with our shader.  I divide it by two, its dimension. It's the graphics card that is dividing the vertices. The original data is still the same I send in. We could move it horizontally. We are adding two back to two. So the triangle move to right. So with these two examples, you have learned two things. First, you can scale your geometry using a multiplication or a division, and you can move your geometry using simple addition or subtraction. Now we want to use the third dimension. We want to give depth to our models. Before going on, we have to introduce the camera paradox. While you are playing your game, there is always the concept of camera. You are basically an operator with a camera in your hands following the player continuously. There is no camera in your game. It is a paradox. You do not move the camera, but you move the word.  If you move the camera, the photo will result in the mountain moved. We do not have a camera in our game. We are the camera. So we need to move the word. So if the camera moves to the left, the result is moving the word to the right, and so on. The camera does not exist. The camera is simply a math formula. When OpenGL starts, we are in a cube of that dimension. But for faking our eyes, our brain, we need to modify the vertex position to give the idea of prospecting to the viewer. Basically, we need to transform each vertex from that box to a frustum. A frustum is a pyramid without the top. It is very high school math. This is a triangle comparison. Basically, we need to move the point xy, yd, zd, over the black line. So to have something really 3D, we need to transform our vertices. And we want our graphics card to do the transformation. The first transformation is moving from local to world. When we first drawn the triangle, it was in its local coordinates. Then we moved to the right. They are its world coordinates. We placed an object and moved around the world. Then we need to transform this object position in respect to the camera. If the camera moved to the right, we need to move again this object to the left. Finally, we need to transform each of these vertices and project it using this formula.  Matrices. All of those transformations in OpenGL are done with matrices. You can do transformation manually, as we did before scaling and moving the vertices. But the best approach is using matrixes. Don't worry, they are pretty easy. Basically, you build a 4x4 array with specific data and a specific layout, multiplying those matrix by your vector, will generate another vector, transformed by these matrix. On the left, we have a translation matrix. A matrix used for moving objects around the world. A translation matrix is pretty easy. It has all one over its diagonal. Then on the X, Y, Z, on the right, specify how much you have to move the object. The result will be a new vector moved in that direction. Scale matrix. We know scaling is a simple multiplication of the vertices. This matrix allows you to transform and scale. Your models will be bigger or thinner. Then we have rotation. We can rotate our model into the world. Rotation is a bit more complicated. But the rule is always the same. We have a vector 4 and we multiply it for a 4x4 matrix. Matrixes can be combined together, and this is why it is the preferred way for making transformation in OpenGL. We can build a single 4x4 matrix with all the transformation we need. A single matrix can represent a rotation, a translation, and a scale. And finally, we are able to draw something. Back to code. This time I directly start with the shader, because this is the interesting part. Uniform are variables we can set in our game loop. We can constantly change their value without needing to re-upload or recompile the shader. We have two matrices in this simulation. One for the word transformation coordinates, because we want to rotate our geometry. A matrix representing the camera. So a matrix could represent a translation on the x-axis and so on. We generate a color, and we generate a new vertex multiplying the original vertex by word, matrix, and by camera matrix. The result will be something in perspective. The fragment shader is basically the same as before. We set the colors to the vertex value, something pretty random. Vertex array generation. We upload... This time we are drawing a cube. So we have six phases. Each phase is composed by two triangles. So we need to upload a good amount of vertices. A triangle for front, two triangles for front, two triangles for back. Right, left, top, down, and so on. This is a cube. Into our game loop, we start managing input. It is not the topic of this talk, but input is pretty easy. Is this key pressed? Yes. Do something. And this is... What we do. We generate a matrix. This is a simple Python class. We translate the five units far by the viewer. We rotate by the amount the user shows with its keyboard. And we leave a scale of 111. So we do not change the scale. Then we generate the camera matrix that is a composition of our perspective matrix. A matrix representing a perspective projection. And a camera matrix. We are moving our camera five units far from the object. And in this way, we upload the two matrices on the graphics card. And we issue the draw call. Be prepared for another noise. Visual noise. This is our cube. We start rotating it, but you should be faked. Something is wrong. What's happening? Basically, you are experiencing Z-fighting. Pixels are fighting for being the most near to the camera. This is not a good solution. We want the pixel nearest to the camera to be the frontmost. How we can solve this? This is something we can delegate to the graphics hardware. Because in addition to the color buffer, the representation of your pixel in the graphics card memory, you have the depth buffer. It's another buffer with the same size of your graphic context in which you store for each pixel its Z value. The value with the lower Z will win over the value with higher Z. To implement this, we have to enable the GL depth test. And for every draw cycle, we have to clear the color buffer and the depth buffer. Now, our cube should be perfect. I'm rotating it with my keyboard. So, we have seen how to implement perspective, how to fix Z-fighting, but cubes are boring. We want something better. There are really a lot of file formats for 3D models. One of the oldest and most easy to use is the OBJ format. The most used in the game industry is FBX from Autodesk. The advantage of OBJ is it is a text file format. It is basically a list of all the vertices you want to draw. Our code is the same of the cube one. Exactly the same. We have all imported our OBJ loader. This is basically a text parser that will generate an array, a NumPy array of float of those vertices. Here, we open the file and we upload its vertices to the graphics card. Our stone trooper. This is a rasterized stone trooper. There is still not lighting in place, but you can check its silhouette. You can even check the interpolation between colors. These are fake colors. I think it is better to set them to a fixed color. A white should be... Oops, we do not need out color anymore. This is our white stone trooper. What is lighting? Lighting means adding lights management to your model. First of all, forget about accuracy. Lighting in the physics world is completely different and too much complex to implement for an actual computer hardware. There are algorithms that are pretty near to how lighting works in the physics world. They are ray tracing and path tracing, but they are absolutely not usable for real time. Then, we need to absolutely sacrifice indirect lighting. Indirect lighting is the bouncing of lights that generate phenomena like color bleeding. So this desk gets additional colors from the light reflection. This is a bit of black because my shirt bounces over the desk and so on. They give a lot of realism to the scene, but unfortunately they are really slow to implement. Before checking out light, I implemented it into real time game. We need to introduce normals. In the OBJ file we showed you before, in addition to vertices, there are another bunch of vertices defining normals. For these vertex, normals define the direction the vertex is facing. Imagine a vertex over my head. It's normal, it will be on top of my head going over the epsilon axis. How we implement shading. Shading comes from the artistic way of speaking because we generate shades for our meshes. There are various approaches. First is flat shading, pretty old. You can see it on Super Mario for Nintendo 64. So you are clearly able to see each single polygon because every polygon has a different color. Then we have gold shading that is a bit more realistic. This is the hardware encoded in the PSX graphics card, for example. Then we have font shading that is basically the most useful algorithm nowadays. The current password is PBR that stands for Physically-Based Rendering, where we took some of the physical property of a material and we report them in the way we like materials. All of those algorithms, there are more, but this is the foremost used in the gaming world, are based on this simple rule, the Lambert Diffuse Lighting Formula. Basically, Mr. Lambert says that the more the cosine generated by the direction from the light to the vertex, between its normal, the higher is the cosine, the pixel will be more enlightened. Let's see how we could use it. In addition to vertices, now we need to upload in the graphics card even the normals of each vertices. Our vertex shader will spit out the Lambert value. The Lambert value is a value between 0 and 1. The cosine is a radical function. It goes from minus 1 to 1 and so on. We are not interested in the values between minus 1 and 0, because from the light point of view, they are not shaded. First, we place a light in our scene. We place a light on 10 epsilon. Then we compute the light direction. This is a simple formula. It is the normalized value of the subtraction between the destination, that is our vertex, and the start, that is the position of the light. Then we take the normal that, remember, the normal you find in the OBJ file is not in word coordinates. In local coordinates, if we move the object, we need to move even its normal. We multiply the normal for the word matrix and we compute the Lambert. Fortunately, in linear algebra, we have the dot product operation that basically returns the cosine between two vectors. In a single shot, we can compute the Lambert factor, but we do not want value lower than 0. We use the max function to discard all of the values lower than 0. In the fragment shader, we still use the white color, but we multiply it for the Lambert factor. It is, I suppose, a really simple math, but the result is pretty astonishing. This is the result. It is the same code as before, but adding the Lambert value, we get that, we got that, we get that for our model. Obviously, we can move the light, we could place it under the feet of the stormtrooper, and you get the light from bottom to up. Texturing. Texturing is managed again by the graphics card. You upload the texture, they are images, and you tell the graphics card to place them around your model. This is a texture for our stormtrooper. This is a standard two-dimensional image. The code is again the same, but we need another bunch of data. These are the UV coordinates. Why they are called UV? The official answer is because X and Y are already taken. U and V are the anchor point of each vertex. Basically, they tell which pixel of the texture to attach to a specific vertex. Our vertex shader remains the same. We only pass the UV coordinates to the fragment shader, and we stop using plain white. Instead, we use the pixel contained at the UV position of the texture. The result is the stormtrooper with its texture. You can see black globes, the image over the belt. We are not far from what you can find in a modern game. Is it enough for a game? First of all, if you want to go AAA, so you want to build a game for the masses, think about it twice, because nowadays AAA game is like an Hollywood production. You need a lot of money, a big team, and so on. If you want to go that way, you will need to start adding features to your game engine. First of all, you have to start baking lights. Computing lights, especially for not moving objects, is a waste of resources. So you pre-compute light and apply them as textures on your models. In the same way you can pre-compute shadows. We haven't seen how to build shadows in OpenGL, but it's not so complex. And pre-compute indirect lighting. In this case, we use algorithms like ray tracing, path tracing, which will require a lot of time, to build another texture containing the reflection of the objects around the screen. You can start implementing skeletal meshing, so you apply a virtual skeleton to each of your models, and you animate that model moving the bones. You could use the stencil buffer that is implemented by your graphics card and allow you to store a custom value in a buffer for each pixel. You can use it for volumetric shadows, volumetric clouds. There are a lot of using. Instancing. Instancing allows you to upload a single model to the graphics card and draw it thousands of times with zero cost. There are a lot of things you can add to your game engine. Video games are games. This is my suggestion. They must be fun. Being beautiful is optional. We have been playing games for over 40 days. After 40 years, we still enjoy playing games. What about Vulkan? Vulkan is another standard, a new standard managed by the Kronos group. The same that is managing OpenGL. Vulkan is a really low-level library, low-level API. It is so low-level that the Kronos team told developers to start building layer and Vulkan because Vulkan is too much complex. So very probably you will never start developing with Vulkan, but you will continue developing with OpenGL as a bridge to Vulkan.  The last one is the repository of AIV didactical libraries. You will find the Python code there. I strongly suggest you to check the link on the center. It describes how games like Vulkan's time 3D or DOM are implemented. They show you the code to implement the re-casting. Questions? Thank you, Roberto. So if you have questions, don't hesitate. Wait for the microphone so that we hear you on the recording. Hi, thanks for the talk. Do you know if there are implementations of the Vulkan API, like the OpenGL implementation, oriented through C-types? Frankly, I'm not aware of that, but I don't think there are already implementation because Intel released their Vulkan implementation for Intel hardware a couple of months ago, and it's still unstable and with the research topic. So we need to still wait a bit before having something usable. We've got more of a question about what it's like in the industry and all. How often is Python actually used for this sort of gaming and graphics thing? And one of the reasons why I'm asking is I think I saw something from Unity on your desktop as well. Well, this is a good question with a set answer. It is very unlikely you will be able to build a whole game only with Python. But from what I can tell you what I've seen as a teacher in the Italian Video Game Academy, Python has a great value. We teach OpenGL with Python because Python teaches programmers, students to code well in a way your co-worker or other people can understand what you're coding. And this is a skill very few hardcore game developer have. And this is truly a problem in the industry. Approaches that are well established in other IT industries like testing, agile methodologies are completely misused in the gaming world. So it is very important for us to teach this lonely thing with Python. In addition to this, building a game is not only building the graphics engine. But probably you will start building a lot of tools for artists. You can use absolutely Python. Disney is one of those companies using Python for building tools for artists. You can use Python for the networking part. Not only for the multiplayer networking but also for services. You can build a web API for your game. Every game now has the need for a web API and so on. Unfortunately, we cannot expect to be able to write a whole game with Python. Especially because now we have things like Unity 3D, a real engine that are really, really powerful. I will not start building a game from scratch if not for learning how to write games when I have those powerful tools. Python is a good companion for those tools. Any other questions? Yes. Nowadays you hear quite more fuss about direct text in OpenGL. What would you say are the pros and cons today besides Microsoft advertisement? Well, I'm a little bit biased because I'm not a big fan of any Microsoft technology. Currently DirectX 12 is very near to welcome as an approach to programming. In fact, the vast majority of gamers feel on DirectX 11 because 12 is too much difficult for them. Microsoft is investing a lot in DirectX, but frankly making a comparison between the two by me would be a bit biased. I prefer OpenGL because the right one deploy to everywhere. Thank you. So if there are no more questions, I have one question. What does Vulkan brings in comparison to OpenGL? Sorry? How does Vulkan compares to OpenGL? It's really, really low level. You have to allocate memory manually on your graphics card. Remember to free it. You upload on the graphics card a binary representation of the opcodes of the GLSL language is really, really low level. Something more interesting for driver developers than for game developers. For driver developers? Driver? It's more interesting for driver developers. Right. Does that mean that it's a bit similar to technologies like OpenCL and CUDA? Not at that level. Oh, well, maybe OpenCL is too much high level with respect to Vulkan. And using OpenGL to make presentations showing up things that are not games, have you seen that being used with Python? Yeah, absolutely. We work with the Monza racing team for making simulators for their drivers. So we use OpenGL right there and a lot of that parts are made with Python. Any more questions? It seems like you have more opinions I was wondering if you could maybe explain whether they're used and if they aren't used, why not? Well fun here. I prefer fun shading over PBR now because PBR requires your whole graphics team to use that approach to building textures, choosing materials and so on. Personally every time I need to interact too much with artists something goes wrong always. With the fun shading I'm a bit more responsible of the final result of the game. In addition to this implementing fun shading is a matter of five lines of GLSL. Implementing physical rendering is about 200 lines of pretty unreadable code. In addition to this with fun shading you need to implement diffuse lighting with Lambert. You need to implement ambient lighting that is basically a sheet. Ambient lighting emulates the fact that in real life nothing is completely dark. So to simulate this we basically add a bit of fake lighting to the color. You need to implement specular lighting that is the phenomenal when you are at gazing angles between geometry the light reflects perfectly with your eyes so you see the object shining and then you have finished implementing the fun shading model. With PBR you need to introduce Fresnel effect to your shading algorithm. Fresnel is that you can get more lights at their edge that is not really easy to implement. So basically I'm more towards the old style fun shading because it's simple. We'll end the session here if you have more questions I think you can contact directly Roberto outside. Thank you very much to you and Roberto.


I don't know how many people saw this video, but I had to talk about a recent segment on Fox News from Tucker Carlson because lately he's been railing against the so-called leftist mob, and usually we're supposed to believe that the left-wing mob is overly PC, hypersensitive, and weak overall, but now we're supposed to believe that the left-wing mob is intimidating and dangerous and we're supposed to be afraid of the so-called left-wing mob. Now what really struck me was one of the examples that he uses to prove how powerful and threatening quite frankly this left-wing mob actually is. He cites Elmo as an example of the left's power, and yes, we're talking about that Elmo, the one from Sesame Street, a children's show, that according to him is evidence that the left had become all too tyrannical for his liking. I wish I were joking, this is quite literally indistinguishable from Satyre, but nonetheless, this is a real segment from a real news channel. Who are the people trying to take over your country, cancel your rights, eliminate our centuries-long tradition of tolerance, yes, tolerance, and a free expression? And the truth is we often don't know their names, they're mostly faceless political agitators who exist primarily online, they're trolls who thrive on cruelty, and yet suddenly they have immense power over all of us. Weak leaders now reflexively bow to their demands no matter what those demands are. Why is that? What's changed? Well, that's a much longer conversation, we probably ought to do an entire show on that topic, and if the news ever comes down long enough to think in bigger terms, well we will do that. But for now it's enough to say that the country's defenses have been badly weakened by decades of relentless propaganda, all of it designed to make us feel that we have no right to stand up for ourselves, to stand up for our country.  We could spend days showing you examples of this, but here's just the very latest, it's from CNN over the weekend. Yeah, I'm bringing this sign to the protest at the community center later. Wow, look upset, are they protesting? They are sad, and upset, and they have every right to be, Elmo. People are upset because racism is a huge problem in our country, but across the country people of color, especially in the black community, are being treated unfairly because of how they look. Children's show, got that Bobby? America is a very bad place and it's your fault, so no matter what happens, no matter what they do to you when you grow up, you have no right to complain. I don't even know what to say to that. Look, watching that Sesame Street clip, what I got out of that was that Elmo was talking to his dad and his dad was trying to educate him about racism, but what Tucker got out of that was America is a very bad place and it's your fault. At what point was that the implication of this short clip? At what point did Elmo's dad try to convince him that America is bad because he doesn't know about racism or whatever? I don't even know how he connects the dots here. It doesn't make sense. He's making a lot of logical leaps he's reaching. I mean, this is supposed to be a serious news person on a serious news network, and he is literally conflating Elmo with some type of power that the left has and some nefarious plot to bring Americans to heal. This is how we're going to do it with Elmo.  I don't know how else to describe what we just saw there. Now he says some other things that I want to point out. Who are the people trying to take over your country, cancel your rights, eliminate our centuries-long tradition of tolerance, yes, tolerance, and free expression? He's asking you this question, and it's supposed to be posed in a rhetorical way. He wants to say the left. But I have an answer. It's Republicans. Donald Trump literally just a couple of weeks ago threatened to use the United States military to violently crush protests taking place.  But if you think that the left and the left-wing mob, whatever that may be, is more dangerous than the president threatened to violently stifle people's first amendment rights, then, I mean, you're just being disingenuous. You are not cut out for a job where you do political commentary. You're not.  And I think that he knows better. I think he knows that he's lying and he made a comment about propaganda. It's enough to say that the country's defenses have been badly weakened by decades of relentless propaganda, all of it designed to make it feel like we have no right to stand up for ourselves. I mean, what are you talking about? You are the propagandist, Tucker. You are the one doing propaganda. You are the one that's relentless. And you are not the victims. You're not the ones who are being oppressed. Right-wingers in America are doing pretty damn good. You hold the White House currently. You have the Senate. Why are you crying?  You're the one who initially said when these protests broke out that these protesters are being tyrannical. So who is it who actually is trying to stand up for themselves? I mean, in actuality, objectively speaking, we know it's the protesters.  They're right to walk down a street and not have to worry about being murdered by a police officer. But to Tucker Carlson, it's the right. It's normal Americans, i.e. white Americans, who is trying to suggest other ones under attack here. He also says the left mob have immense power and weak leaders reflexively bow to their demands no matter what those demands are. All right, well, if that's the case, if the left is so powerful, then why is it that we don't have Medicare for all? Why is it that we haven't done anything about climate change? Why is it that we couldn't actually get a left wing democratic nominee, Bernie Sanders? Why is it that capitalism is still a thing if the left is so powerful? No, the left actually is powerless currently. Sure, we're trying to elect people who are left wing to government. But I mean, you can count the number on a couple of hands of people who are actually left wing, genuinely progressive. But the right wing, neoliberal consensus, has been the status quo. But I mean, let's all just go back to the point that he made or the example that he used more specifically to suggest that the left is trying to, I don't know, tear down America's values. He cited an example of Elmo, a puppet, being taught about racism. So I mean, I've extracted as much substance from this segment as I possibly can. But at the end of the day, this is a joke. He's fear mongering about Sesame Street.  Because Dave Rubin, of course, had to chime in and he tweeted out, good morning to everyone except Sesame Street and CNN. No kid at the age they're into Elmo needs to be talking about racism, especially via cable news. This is brainwashing and child abuse. So according to Dave Rubin, who does not have children, teaching kids at a young age not to be racist is controversial. It's tantamount to child abuse in his opinion. So if you are worried about what we're teaching our children and whether or not we're brainwashing them, have you called out religious indoctrination? Do you think that it's bad to brainwash children into particular religions at an early age? Do you think that it's bad to brainwash children into thinking that being homophobic is acceptable? No, if we teach them to be racist, that's where he has an issue there.   He uses the platform that he has to boost the very people who are against his existence as a gay man, which I mean judging by the trajectory that he's on. I'm assuming he will divorce his husband and renounce his homosexuality within the next year or two. And quote me now, I called it first because that's where we're headed with him. I mean, this is not a serious person. If you are outraged at the fact that people want to teach children not to be racist, then you have to admit here. I mean, the subtext is that you think that that's bad, that being racist is okay. Why is it unacceptable to teach children that being racist is bad? Why is it unacceptable to educate children?  You absorb everything. So I think it's a perfect time to try to instill some sort of values into children and especially values which, you know, I thought we all agreed on were good, such as racism is bad. But I mean, according to Fox News, Tucker Carlson, Dave Rubin, if you try to teach children that racism is bad, this is evidence that the left is a mob that's trying to take over the country.   Like who are you persuading? Who is going to watch this as a grown-up and think, wow, you know, teaching children through Sesame Street that racism is bad really shows how far we've fallen as a country.  So the fact that Tucker Carlson and Dave Rubin are outraged that Sesame Street is trying to teach children that racism is bad kind of shows you a lot about their views or, you know, the views that they are paid to espouse.  Racism is bad. That shouldn't be controversial. The fact that it is speaks to how far we've fallen in the opposite direction, speaks to how much power right-wing reactionaries have.


So we're here at the MediaTek booth, so who are you? Hi, I'm Ernest Thomas, I'm the product marketing of our MediaTek smartphone business. And so here at the show at Computex, you announce P10. So what is P10? Okay, I think P10 is our new video family product, and he's target as a performance segment. And he highlights his ultra-low-power design, so he can improve lots of, we call it DOU, day of use. And he also provides Truata Core technology, Truata Core, so he can have a best performance, also we have a best power performance, so he can improve lots of user experience on the battery, on the daily drive. So what's the difference between the X and the P? Okay, I think X is called extreme performance. So the AX is a little higher than P. P actually still has a very good performance, but he more highlights about power performance. So this is about longer battery life? Yeah, yeah. At the same time, keeping a premium experience? Yes. So Truata Core, did you say is an octa-core ARM Cortex A53? Yeah. Is there all the cores at the same clock speed, or do you have different cluster? All the cores can run up to 2 GHz, and each core can turn on and turn off independently. So this is not big little, right? Yeah, not big little. But you have your own scheduler technology? Yeah, we call it copilot technology. So we still acquire copilot and this P10 product. So it will be copilot 3.0? Or is that only for the X20? Yeah, 3.0 is talking about three customers. So that's only X series, X20. So the P10 right now is only copilot 2.0. So do you announce and how soon it will be? I think this product will be MP and second half. Yeah, even the end product you will see before this year, end of this year. But do you have another product with Octa-core A53? Or is that the only one that you have so far? This year? Yeah. We have two other cores for the case 4. Is it 8163? 8163, or one of them? No, 8163 is our template product. And that's our first product with the A72 big CPU. But it didn't use the Octa-core. Cool, so this is mainly for smartphones? Yes.


Everybody forced here at being twenty one twenty two prison basketball choice ten box number thirteen tiered random team style results Can be found a late in sports cards dot com? Links and chat. Let's get started. I feel that Chad. I Feel that was like we have enough we have a good amount of viewers as much as we ever always do on like a weeknight That doesn't have like a big release People's have it on chilling. All right. Here we go. So Silver's first Well silver then blue yellow greens. We got silver Davey on Mitchell Kings Nessmith Celtics blue yellow greens now Rockets Jason Tate Pistons Hamidou Diallo and a David Johnson rookie Raptors look at this Monster sensational signatures green Scotty Barnes three out of eight Gigantic hit for Toronto Gregory M sweet Everybody's awake now. Everybody's awake now Brad rookie Jalen Suggs now 71 of 88 there you go magic Great box and a son's CP 3 is 57 of 88 Hey, sounds good essence appreciate it He's a beast man. I know he isn't putting up crazy numbers, but he's still 20 He's good. He's gonna develop. I think in this. I'm crazy Silver and Noel for the T-wolves Silver Richardson Celtics Blue yellow greens Cavs Chetty Osmond Nuggets Michael Porter Jr. And Rockets rookie Alperin shengun Turkish Tim Duncan Yeah, a red choice auto is Harold minor for the heat Baby Jordan, right? There he is baby Jordan Red blue purple rookie Joshua Primo Spurs 11 to 15 And a nuggets Tiger Stripe Jamal Murray nice card Is he playing Silver Composite Nuggets silver RJ Hampton magical the nuggets are dominant right now playoffs. Yeah blue yellow green marketing Cavs Gary Trent Raptors and Cuckoach bulls Red choice auto jazz Arizona, Elia Sova a red choice Ricky David Johnson Raptors 43 of 88 I was talking about a Scotty Randy and a Kira Lewis Jr. Tiger Stripe for the Pelicans Curry Nebula was was the curry Nebula hits he's numbered rookies are numbered curry. I Had heard of it being hit, but doesn't mean it wasn't Like all the Nebula I feel like a lot of it has been pulled Ricky silver Scotty Lewis Hornets silver Danny green Sixers blue yellow green clips Surgey Baca Warriors Jemon Green and he Jimmy Butler Nets rookie Otto Cameron Thomas. I guess you could say the same for Suggs too, right Randy? Guess you kind of could I Don't think he'll be like he's got a Barnes level, but uh, you know Nets Cameron Thomas the 88 rookie red choice and a blue for the magic some color match on the penny 19 of 39 guys Sean's going on a world tour in a couple months here We're sending him to California we're sending him to Vegas Go silver clean Capella Hawks silver Ray Allen bucks you go to Vegas. You might meet Joshua. Let's go. Yeah, sure Blue yellow green Jalen Brown Celtics Seth Curry Sixers and Vince Carter Raptors Areas magic Jalen Suggs on the red choice sensational signatures Orlando blue for the jazz is Joe Ingalls nine of 39 and Red Celtics Jason Tatum 81 of 88 Come on Steph Curry Nebula. Let's hit. Let's hit. Let's hit multiple nebulas in the last five boxes here More than one a nebula. Come on. All right silvers and blue yellow greens Celtics Jason or Josh Richardson I'm Jason Nasred for the T-wolves blue yellow greens now sixer shake Milton Sixers Ben Simmons and Mavericks Wang Ji Ji Milton out over the Bucks red choice Pelicans Devontae Graham red 84 of 88 sixers Alan Iverson 85 of 88 Next week's releases are absolutely wild dude flawless baseball and maculate basketball impeccable football like what? and Finest baseball like what? Silver rookie Jalen Green Rock. It's very nice Lonzo for the bulls silver blue yellow greens now. Nick's Alec Burke Alex Burke's sons Cameron Johnson and Hornets rookie JT Thor Nuggets red choice Ricky sensational signatures bones. Highlands damn bound Sondra Mama kill the Shvilley rookie red for the Bucks 25 of 88 a blue John Wall for the Rockets 32 of 39 Lakers came back to the four and now it's nine-o run That's the Lakers all season Trash All right, silver Lakers Kendrick Nunn next Miles McBride Yellow green Brandon your pelicans Markel folds magic and Mama Kelly Shvilley rookie Bucks Nets again a rookie Otto Cameron Thomas red choice magic Mo Bamba red 288 and blue for the Lakers Anthony Davis 639 There's a print line on the Davis Hey Donald, how's it going? We're doing all right. We're hanging in there. We're pushing through. We're trying to pull heat trying to pull a nebula right now luck You have to summon it dig deep silver Zion pelicans silver THT Lakers Blue yellow green Dora Bucks Richardson Celtics and Primo Spurs Houston's red choice auto Ben Wallace Yeah, they still won't win though, right Red white side for the jazz to 88 and a blue Tyler hero heat eight of 39 eight of 88 on the white side Come on nebula Come on nebula. Come on Silver rookie warriors Jonathan Kaminga Silver eight and sons blue yellow greens Rockets Kevin Porter Jr. Jo Engels jazz Malone jazz Magic red choice rookie Otto Franz Wagner. Good break for the magic. There you go Jeff the bronze mags Sergio Baca clippers blue 24 of 39 and a red on the back on to the Thunder shy Gildes Alexander 57 of 88 That is gonna do it. Not the biggest case had a huge hit though had this awesome Scotty Barnes green auto for the Raptors Huge card there not many others unfortunately guys. I'm sorry. I appreciate it moving on to select now